简体   繁体   English

尝试在 WPF 中绘制矩形立方体的边缘但未成功

[英]Trying to draw the edges of a rectangular cube in WPF but not successful

I am trying to draw and display only the edges or sides of rectangular cube but still no success using WPF. It is inside a user control that I want to display in a windows form (c#) application.我正在尝试仅绘制和显示矩形立方体的边缘或侧面,但使用 WPF 仍然没有成功。它位于我想在 windows 表单 (c#) 应用程序中显示的用户控件内。 As I have seen, 3D objects in WPF are made using triangles so i tried to draw the lines using rectangles where the the width of the rectangle is small (enough to be recognized as an edge or side of the cube) but it is not displaying correctly.正如我所见,WPF 中的 3D 个对象是使用三角形制作的,所以我尝试使用矩形绘制线条,其中矩形的宽度很小(足以被识别为立方体的边缘或侧面)但它没有显示正确。 Here's the code I'm using:这是我正在使用的代码:

<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>

I'm thinking of trying other graphics libraries like opengl or gdi+.我正在考虑尝试其他图形库,如 opengl 或 gdi+。 If you know how to draw a 3D line in wpf then please demonstrate with an example.如果您知道如何在 wpf 中绘制一条 3D 线,请举例说明。

Whatever you draw, it needs to be tessellated, since WPF essentially draws triangles.无论您绘制什么,都需要对其进行细分,因为 WPF 本质上绘制的是三角形。

So to model a line as a set of tessellated surfaces, first think of the line as a solid , or more specifically, a long rectangular prism with a small cross-section.因此,对于 model 一条线作为一组镶嵌曲面,首先将该线视为实体,或者更具体地说,是具有小横截面的长直角棱柱。 If you think of the line this way, you have a six-sided solid (including the two "end caps" of the line, if you even want them), and you can define the appropriate triangles and WPF will render it just fine.如果你这样想这条线,你就有了一个六边形实体(包括线的两个“端盖”,如果你想要的话),你可以定义适当的三角形,WPF 会很好地渲染它。

A little cumbersome for sure, but definitely doable.当然有点麻烦,但绝对可行。

If there is a better way out there to do this in WPF, I'd love to hear about it.如果在 WPF 中有更好的方法可以做到这一点,我很想听听。

If you want to render the mesh of your 3D object, some recommend the Helixtoolkit add on.如果你想渲染你的 3D object 的网格,有人推荐Helixtoolkit插件。 But the "linevisual3D" contained in this add on is pretty lame...但是这个附加组件中包含的“linevisual3D”非常蹩脚......

I encourage you to think not on 3D prisms (like SlimsGhost said) but as 2D rectangles and then using backmaterial properties to make it visible both ways.我鼓励您不要考虑 3D 棱镜(如 SlimsGhost 所说),而是考虑 2D 矩形,然后使用背面材料属性使其双向可见。 I've coded this and it work very fine (better than Helix Linevisual3D)我已经编写了这个并且它工作得很好(比 Helix Linevisual3D 更好)

PS: if that really raises interest I can post the method in another dedicated thread. PS:如果这真的引起了兴趣,我可以在另一个专用线程中发布该方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM