C# 在wpf中绘制三维直线

C# 在wpf中绘制三维直线,c#,wpf,3d,C#,Wpf,3d,我试图在wpf中绘制一条3D线,我有以下xaml代码: <Grid> <Viewport3D x:Name="ViewerViewport" RenderOptions.BitmapScalingMode="HighQuality" Focusable="True" Grid.RowSpan="2"> <ModelVisual3D x:Name="Model">

我试图在wpf中绘制一条3D线,我有以下xaml代码:

<Grid>
    <Viewport3D x:Name="ViewerViewport"
                RenderOptions.BitmapScalingMode="HighQuality"
                Focusable="True" Grid.RowSpan="2">

        <ModelVisual3D x:Name="Model">

        </ModelVisual3D>

        <!-- Camera -->
        <Viewport3D.Camera>
            <PerspectiveCamera x:Name="Camera"
                               Position="0,0,0"
                               LookDirection="0,1,0"
                               UpDirection="0,0,1"
                               FieldOfView="100"
                               FarPlaneDistance="10"
                               NearPlaneDistance="0.1"/>
        </Viewport3D.Camera>

    </Viewport3D>

</Grid>
和行创建代码:

  private Model3D AddLine(Point3D startPoint, Point3D EndPoint, string name)
    {
        SolidColorBrush brush = new SolidColorBrush(Colors.Black);
        var material = new DiffuseMaterial(brush);
        var mesh = new MeshGeometry3D();
        mesh.Positions.Add(startPoint);
        mesh.Positions.Add(EndPoint);
        mesh.TriangleIndices.Add(0);
        mesh.TriangleIndices.Add(1);
        mesh.TriangleIndices.Add(0);
        return new GeometryModel3D(mesh, material);
    }
但它在输出中没有显示任何行

这有什么问题


我知道有一些3d库可以很容易地做到这一点,但我喜欢学习如何在WPF中做到这一点,然后研究如何使用库(如helix3d)来做到这一点。

为什么要只画线。在3D中,通常需要三角形。如果有三角形,则可以确定法线。它们用于定义用于照明和纹理处理的三角形的面

摄像机设置
典型的摄像机
位置
位于正z坐标(类似于0、0、2或5、0、20),
注视方向
矢量为0、0、-1,
向上方向
矢量为0、1、0。在这种情况下,轴的位置应与通常相同(正y轴向上,正x轴向右)。
如果将
UpDirection
更改为1、0、0,则正x轴将向上移动,而不是向上移动y轴。
如果将
Position
更改为负z坐标(0,0,-5)并将
LookDirection
更改为0,0,1,则从“后面”查看sceen,使正x轴向左(而不是向右)移动,但y轴仍向上移动

在您的设置中,您的相机从原点指向正y数字,z轴向上。X轴仍然向右移动。如果我在代码中添加第三点。点100,0,100,你可以看到黑色的小三角形

mesh.Positions.Add(startPoint);
mesh.Positions.Add(endPoint);
mesh.Positions.Add(new Point3D(100, 0, 100));
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);

这个三角形很小,因为它距离摄影机-100很远。正如@Samuels在评论中所说,设置中的另一个错误是
FarPlaneDistance=“10”

您正在创建一个三角形,其中两个角位于同一点,这是一个面积为零的三角形,因此从任何角度都看不到它。WPF只使用具有面积的三角形

要创建一条直线,您必须创建一个长度和宽度与直线相同的矩形,然后用对角线将其拆分以创建两个窄三角形。所以你需要四个位置和两个三角形,比如“01123”。当然,你必须确保这个矩形的方向是朝向相机的


您可以使用google或bing for helix toolbox,这是WPF中一个优秀的3D实用程序库。在那里,您可能会找到一个有用的帮助函数。

您正在构建没有厚度的线条……实际上,这和像素着色是WPF中最重要的两个问题。。。。
如果你想画线,你必须把它做成一个四边形(2个connex三角形),如果你想变得更聪明,三角形的数量更少,你可以使用其他技巧(我会让您考虑一下^^,但是对于给定的网格,您可以有一个线框,该线框的三角形数与网格的三角形数完全相同,如果创建四边形,则不会出现这种情况)

设置远距(
远距
)更高。看起来您正在将图形剪裁为10,并将线条绘制为大约100。将其设置为1000。@Samuel感谢您的建议,尝试了它但没有成功:仍然看不到线条!进一步制作摄影机。
Position=“50,0,0”,LookDirection=“-1,0,0”
并删除远平面和近平面距离以及向上方向。然后在0处绘制线。或者,如果要定位,必须看到此图
mesh.Positions.Add(startPoint);
mesh.Positions.Add(endPoint);
mesh.Positions.Add(new Point3D(100, 0, 100));
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);