表示为长细三角形的线条在 3D 中不可见

本文关键字:3D 三角形 表示 | 更新日期: 2023-09-27 18:35:36

我正在尝试在 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>

而这个 C# 代码:

public MainWindow()
{
        InitializeComponent();
        var ModelsGroup = new Model3DGroup();
         ModelsGroup.Children.Add(this.AddLine(new Point3D(0, 0, 100), new Point3D(0, 100, 100),"line 1)"));
         ModelsGroup.Children.Add(new AmbientLight(Colors.White));
        Model.Content = ModelsGroup;
}

和行创建代码:

  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 中不可见

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

要创建一条线,您必须使矩形成为该线的长度和宽度,并用对角线将其分割以创建两个窄三角形。所以你需要四个位置和两个三角形,比如"0 1 2 0 1 3"。然后,当然,您必须确保此矩形的方向使其面向相机。

你可以谷歌或必应的螺旋工具箱,这是一个优秀的WPF中3D实用程序库。在那里,您可能会找到一个有用的帮助程序函数。

为什么你想画一条线。在 3D 中,您通常需要三角形。如果你有三角形,你可以确定normals。它们用于定义用于照明和纹理的三角形的面。

相机设置
典型的相机Position位于正 z 坐标(类似于 0、0、2 或 5、0、20)LookDirection矢量为 0、0、-1,UpDirection矢量为 0、1、0。在这种情况下,轴应按常规位置定位(正 y 轴向上,正 x 轴向右)。
如果将UpDirection更改为 1, 0, 0,则正 x 轴上升而不是 y 轴。
如果您将Position更改为负 z 坐标 (0, 0, -5),将 LookDirection 更改为 0, 0, 1,那么您从"后面"查看您的场景,因此正 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的两个最重要的问题。如果你想画线,你必须把它构建成一个四边形(2个连接三角形),如果你想变得更聪明,三角形的数量更少,你可以使用其他技巧(我会让你考虑一下^^,但对于给定的网格,你可以有一个与网格完全相同的三角形数量的线框, 如果您创建四边形,情况并非如此)