2

我正在尝试仅绘制和显示矩形立方体的边缘或侧面,但使用 WPF 仍然没有成功。它位于我想在 Windows 窗体 (c#) 应用程序中显示的用户控件内。正如我所看到的,WPF 中的 3D 对象是使用三角形制作的,所以我尝试使用矩形来绘制线条,其中矩形的宽度很小(足以被识别为立方体的边缘或侧面)但它没有显示正确。这是我正在使用的代码:

<UserControl x:Class="Spatial_and_Temporal_Research.BoundingBoxes"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" DataContext="{Binding}" Height="509" Width="739" FontFamily="Times New Roman">
        <Grid>

            <!-- Place a Label control at the top of the view. -->
            <Label 
                    HorizontalAlignment="Center" 
                    TextBlock.TextAlignment="Center" 
                    FontSize="20" 
                    Foreground="Red" 
                    Content="Model: Cone"/>

            <!-- Viewport3D is the rendering surface. -->
            <Viewport3D Name="myViewport" >

                <!-- Add a camera. -->
                <Viewport3D.Camera>
                    <PerspectiveCamera 
                            FarPlaneDistance="20" 
                            LookDirection="-6, -5, -4" 
                            UpDirection="0,1,0" 
                            NearPlaneDistance="1" 
                            Position="6 5 4"
                            FieldOfView="45" />

                </Viewport3D.Camera>

                <!-- Add models. -->
                <Viewport3D.Children>

                    <ModelVisual3D>
                        <ModelVisual3D.Content>

                            <Model3DGroup >
                                <Model3DGroup.Children>

                                    <!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. -->
                                    <AmbientLight Color="White" />

                                    <!-- Define a red cone. -->
                                    <GeometryModel3D>

                                        <GeometryModel3D.Geometry>
                                            <MeshGeometry3D 
        Positions="-0.55 -0.5 -0.5  -0.45 -0.5 -0.5  -0.55 -0.5 0.5  -0.45 -0.5 0.5  -0.55 0.5 -0.5  -0.45 0.5 -0.5  -0.55 0.5 0.5  -0.45 0.5 0.5  0.45 -0.5 -0.5  0.55 -0.5 -0.5  0.45 -0.5 0.5  0.55 -0.5 0.5  -0.5 -0.55 -0.5  -0.5 -0.45 -0.5  0.5 -0.55 -0.5  0.5 -0.45 -0.5  -0.5 -0.55 0.5  -0.5 -0.45 0.5  0.5 -0.55 0.5  0.5 -0.45 0.5  0.45 0.5 -0.5  0.55 0.5 -0.5  0.45 0.5 0.5  0.55 0.5 0.5  -0.5 0.45 -0.5  -0.5 0.55 -0.5  0.5 0.45 -0.5  0.5 0.55 -0.5  -0.5 0.45 0.5  -0.5 0.55 0.5  0.5 0.45 0.5  0.5 0.55 0.5"

         TriangleIndices="0 2 3  3 1 0  4 6 7  7 5 4  1 0 4  4 5 1  3 2 6  6 7 3  8 10 11  11 9 8  13 12 14  14 15 13  17 16 18  18 19 17  20 22 23  23 21 20  17 16 20  20 21 17  19 18 22  22 23 19  25 24 26  26 27 25  29 28 30  30 31 29"                                       
             >

                                            </MeshGeometry3D>
                                        </GeometryModel3D.Geometry>

                                        <GeometryModel3D.Material>
                                            <DiffuseMaterial>
                                                <DiffuseMaterial.Brush>
                                                    <SolidColorBrush 
                                Color="Red" 
                                Opacity="1.0"/>
                                                </DiffuseMaterial.Brush>
                                            </DiffuseMaterial>
                                        </GeometryModel3D.Material>                            

                                    </GeometryModel3D>

                                </Model3DGroup.Children>
                            </Model3DGroup>

                        </ModelVisual3D.Content>

                    </ModelVisual3D>

                </Viewport3D.Children>

            </Viewport3D>
        </Grid>

</UserControl>

我正在考虑尝试其他图形库,例如 opengl 或 gdi+。如果您知道如何在 wpf 中绘制 3D 线,请举例说明。

4

2 回答 2

0

无论您绘制什么,都需要对其进行细分,因为 WPF 本质上是绘制三角形。

因此,要将线建模为一组镶嵌曲面,首先将线视为实体,或者更具体地说,将其视为具有小横截面的长矩形棱柱。如果您以这种方式考虑线条,您将拥有一个六边形实体(包括线条的两个“端盖”,如果您甚至想要它们),您可以定义适当的三角形,WPF 会很好地呈现它。

肯定有点麻烦,但绝对可行。

如果在 WPF 中有更好的方法可以做到这一点,我很想听听。

于 2014-07-12T22:39:04.197 回答
0

如果您想渲染 3D 对象的网格,有些人推荐使用 Helixtoolkit 插件。但是这个插件中包含的“linevisual3D”非常糟糕......

我鼓励您不要考虑 3D 棱镜(如 SlimsGhost 所说),而是考虑 2D 矩形,然后使用背面材料属性使其双向可见。我已经对此进行了编码,它工作得很好(比 Helix Linevisual3D 更好)

PS:如果这真的引起了兴趣,我可以在另一个专用线程中发布该方法。

于 2015-05-02T14:24:25.440 回答