表示为长细三角形的线条在 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)执行此操作
您正在创建一个三角形,其中两个角位于同一点,这是一个面积为零的三角形,因此从任何角度都看不到它。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个连接三角形),如果你想变得更聪明,三角形的数量更少,你可以使用其他技巧(我会让你考虑一下^^,但对于给定的网格,你可以有一个与网格完全相同的三角形数量的线框, 如果您创建四边形,情况并非如此)