获取GeometryModel3D的顶点以绘制线框

时间:2013-09-15 12:24:25

标签: c# .net wpf helix-3d-toolkit

我已经使用像这样的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

也许有人知道绘制线框的其他方法? )

2 个答案:

答案 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中的线框非常慢。 (因为它们是用三角形创建的)