我有一个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形状可视化吗?
答案 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)