1

我有一个 3 维数组(名为 V)。它包含体素信息。只要存在体素,V[i][j][k] 的值为 1。只要不存在体素,V[i][j][k] 的值为 0 我想使用 VTK 可视化这个形状。

我写了这段代码:

MyVTKPointPlotter 点绘图仪;

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

这段代码的问题是所有的点都被绘制了,但是渲染速度非常慢。这些点也是二维点,因此它们没有厚度。所以当我旋转我的对象时,我可以看到没有厚度的点(这些点被视为磁盘)。

谁能告诉我如何可视化这个 3D 形状?

4

1 回答 1

0

如果您的体素一起形成很大的浓度,您可以使用等值面可视化:http ://www.evl.uic.edu/aspale/cs526/final/3-5-2-0.htm 。如果前面的比较复杂,google一下,有很多例子说明如何做到这一点。

或者

如果你的白色体素是分散的,我想你可能想要创建一个点云。

我在 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)
于 2013-11-22T14:11:11.143 回答