使用VTK的3D形状:

时间:2013-11-20 06:49:40

标签: vtk volume-rendering

我有一个3维数组(名为V)。它包含体素信息。在存在体素的情况下,V [i] [j] [k]的值为1.在没有体素存在的情况下,V [i] [j] [k]的值为0 我想用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维点,因此它们没有厚度。因此,当我旋转对象时,我可以看到没有厚度的点(这些点被视为磁盘)。

有人能告诉我如何将这个3D形状可视化吗?

1 个答案:

答案 0 :(得分:0)

如果您的体素一起形成大浓度,您可以使用等值面可视化:http://www.evl.uic.edu/aspale/cs526/final/3-5-2-0.htm。如果前面的内容很复杂,那就谷歌吧,有很多关于如何做到这一点的例子。

如果您的白色体素分散,我想您可能想创建一个Point云。

我在Python中使用了这个代码,我修改它以适合您的问题代码。转换到你的语言(这不是测试,但会让你知道):

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)