2013-11-20 5 views
1

У меня есть трехмерный массив (с именем V). он содержит информацию о вокселе. Где бы то ни было присутствующего воксела, значение V [i] [j] [k] равно 1. Если когда-либо нет воксела, значение V [i] [j] [k] равно 0 Я хочу визуализировать эту форму с помощью VTK.3D-форма с использованием VTK:

я написал этот код:

MyVTKPointPlotter pointPlotter;

for(int i=0;i<x_count;i++) 
{ 
    for(int j=0;j<y_count;j++) 
    { 
     for(int k=0;k<z_count;k++) 
     { 
     if(V[i][j][k] != 0) 
     { 
      pointPlotter.PlotPoint(i,j,k,128,128,128); 
     } 
     } 
    } 
} 

Примечание: функции MyVTKPointPlotter все полученные по этой ссылке: http://nawigacjarobota.googlecode.com/svn-history/r10/trunk/wykObMAT/myVTKPointPlotter.cpp

Проблема в этом коде является то, что все точки становятся построены, но рендеринг крайне медленно. Кроме того, точки являются 2 размерными точками и, следовательно, они не имеют толщины. Поэтому, когда я поворачиваю свой объект, я могу видеть точки без толщины (точки видны как диски).

Может ли кто-нибудь сказать мне, как визуализировать эту трехмерную форму?

+0

Вместо того, чтобы использовать плоттер, вы можете просто создать экземпляр 3D-объект (как сфера) в положение каждой точки, чтобы построить ? Прежде всего, это будет трехмерное представление, и, возможно, вычисление также будет быстрее. См. Здесь, как создать экземпляр сферы: http://www.vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/Sphere и просто измените метод setCenter(), используя на каждой итерации ваш i, j и k. –

+0

Сфера aproach имеет недостаток в наличии актера для каждой сферы. Лучше следовать аналогичному решению: облако точек –

ответ

0

Если ваши воксели вместе образуют большие концентрации, вы можете использовать визуализацию изоповерхности: http://www.evl.uic.edu/aspale/cs526/final/3-5-2-0.htm. Если предыдущий сложный, google it, существует немало примеров того, как это сделать.

ИЛИ

Если белые вокселей разбросаны, я думаю, что вы можете создать облако точек.

У меня был этот код в Python, который я изменяю, чтобы соответствовать вашему коду вопросов. Перевести на свой Languaje (это не тестировался, но поможет вам идею):

points = vtk.vtkPoints() 
colors = vtk.vtkUnsignedCharArray() 
colors.SetNumberOfComponents(3) 

#Create the point cloud 
for i in xrange(0, x_count): 
    for j in xrange(0, y_count): 
     for k in xrange(0, z_count): 
     if V[i][j][k] != 0: 
      #If they are many points better use the faster combination of 
      #SetPointCount and SetPoint methods 
      points.InsertNextPoint(i, j, k) 
      colors.InsertNextTuple3(128, 128, 128) 



pointsPolyData = vtk.vtkPolyData() 
vertexFilter = vtk.vtkVertexGlyphFilter() 
polyData = vtk.vtkPolyData() 

mapper = vtk.vtkPolyDataMapper() 
actor = vtk.vtkActor() 
actor.GetProperty().SetPointSize(5) 

pointsPolyData.SetPoints(points) 
vertexFilter.SetInputConnection(pointsPolyData.GetProducerPort()) 
polyData.ShallowCopy(vertexFilter.GetOutput()) 
polyData.GetPointData().SetScalars(colors) 
mapper.SetInputConnection(polyData.GetProducerPort()) 
actor.SetMapper(mapper) 


//Then you'll have to add the actor to your renderer, of course 
myRenderer.AddViewProp(actor) 
+0

Спасибо El Marce .. Я пробовал, как вы сказали мне. Я думаю, что мое облако вокселов недостаточно плотно и, следовательно, когда я увеличиваю визуализированную форму, я могу видеть промежутки между вокселами ... я пытался создать поверхность над точками .. но я думаю, для этого нам нужны полые контуры вместо заполненных. вот что я сделал: сначала взял карту края (ссылается на ось Z) Затем создала поверхность, используя информацию по этой ссылке: http://www.vtk.org/Wiki/VTK/Examples/Cxx/Filtering/SurfaceFromUnorganizedPoints он пришел довольно аккуратно ... Огромное спасибо вам ... :) –

+0

Если вы l iked ответ, вы можете проголосовать за него;) Рад, что это помогает. Я проверю ваше решение. Вы также можете опубликовать его stackoverflow.com, это поможет сообществу! –