2013-09-15 5 views
0

Я загрузил 3d модель с использованием Helix toolking как этотполучая точки вершины GeometryModel3D нарисовать каркасные

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); 

Но ... как я могу получить эти вершинные точки?

EDIT:

Спасибо за ответ. Это же добавить точки

 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

может быть кто-то знает других способов привлечь каркасы?)

ответ

1

Обычно trigons нарисованы с индексом буферами (для предотвращения дополнительных поворотов вершин) Возьмите взгляд на 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. (потому что они созданы с помощью тригонов)

+0

Идея звука хорошая, но она бросает Оператор '<' не может применяться к операндам типа 'int' и 'System.Windows.Media.Int32Collection' –

+0

Я обновил это, есть ли проблемы сейчас? Забыл свойство 'Count', maybee вам нужно' Count() 'Можете ли вы обновить сообщение и добавить новое изображение? (показать предыдущий тоже) –

+0

по-прежнему выглядит перепутанным и медленным veeery (угадать придется искать какой-то другой метод.) –

Смежные вопросы