我已经使用像这样的Helix工具加载了一个3d模型
modelGroupScull = importer.Load("C:\\Users\\Robert\\Desktop\\a.obj");
GeometryModel3D modelScull = (GeometryModel3D)modelGroupScull.Children[0];
我还有_3DTools可以在3d空间中从点到点绘制线条。现在要绘制我的GeometryModel3D的线框,我想我必须循环到它的顶点并将它们添加到ScreenSpaceLines3D。
ScreenSpaceLines3D wireframe = new ScreenSpaceLines3D();
// need to cycle through all vertexes of modelScull as Points, to add them to wireframe
wireframe.Points.Add(new Point3D(1, 2, 3));
wireframe.Color = Colors.LightBlue;
wireframe.Thickness = 3;
Viewport3D1.Children.Add(wireframe);
但是......我怎么才能真正得到这个顶点?
修改
感谢您的回答。它确实添加了分数
ScreenSpaceLines3D wireframe = new ScreenSpaceLines3D();
MeshGeometry3D mg3 = (MeshGeometry3D)modelScull.Geometry;
foreach (Point3D point3D in mg3.Positions)
{
wireframe.Points.Add(point3D);
}
wireframe.Color = Colors.LightBlue;
wireframe.Thickness = 1;
Viewport3D1.Children.Add(wireframe);
但是线框搞砸了)
http://gyazo.com/3a70930150757c6bee9153b02bc459dd.png
也许有人知道绘制线框的其他方法? )
答案 0 :(得分:1)
您应该在MeshGeometry3D.Positions Property
中找到顶点foreach (var point3D in modelScull.Geometry.Positions)
答案 1 :(得分:1)
通常使用索引缓冲区绘制三角形(以防止顶点的额外旋转)看看TriangleIndices:
如果您这样做:(未经过测试)
MeshGeometry3D mg3 = (MeshGeometry3D)modelScull.Geometry;
for(int index=0;index<mg3.TriangleIndices.Count; index+=3)
{
ScreenSpaceLines3D wireframe = new ScreenSpaceLines3D();
wireframe.Points.Add(mg3.Positions[mg3.TriangleIndices[index]]);
wireframe.Points.Add(mg3.Positions[mg3.TriangleIndices[index+1]]);
wireframe.Points.Add(mg3.Positions[mg3.TriangleIndices[index+2]]);
wireframe.Points.Add(mg3.Positions[mg3.TriangleIndices[index]]);
wireframe.Color = Colors.LightBlue;
wireframe.Thickness = 1;
Viewport3D1.Children.Add(wireframe);
}
但是,这可能会产生一些透支(在相同坐标上有2条线)并且可能非常慢。 如果你把每一面放在一个列表中并使用像Distinct这样的东西,它会更好。
ScreenSpaceLines3D的问题是将继续该行,而不是创建1行(开始/结束)。
如果您可以管理一个试图用1行绘制模型的算法,它会更快。
WPF中的线框非常慢。 (因为它们是用三角形创建的)