vtk中的Marching Cubes是否需要特定输入?
我在使用marching cubes类时,传入一个ImageData后,它什么都没生成。
我想从一个3D的numpy数组生成表面。我用evtk把这个数组导出成一个.vti(结构化点)文件,并把它存储为点数据。然后,我用vtkXMLImageDataReader读取这个文件。接着把读取器的输出(vtkImageData)传给vtkMarchingCubes类,但这个类返回的vtkPolyData没有任何点或单元。vtk wiki的例子中用的就是vtkImageData,所以marching cubes类应该能处理这个。
我尝试导出读取器生成的ImageData,输出在ParaView中可以正常可视化。
我只是想知道,vtk中的marching cubes生成表面有没有什么特别的要求?如果3D的numpy数组能直接转换成适合MarchingCubes的数据类型,那就更好了。
这是我用来读取.vki文件并传给marching cubes的代码:
dataReader = vtk.vtkXMLImageDataReader()
dataReader.SetFileName('model_name.vti')
dataReader.Update()
contacts = vtk.vtkDiscreteMarchingCubes()
contacts.SetInputConnection(dataReader.GetOutputPort())
contacts.SetValue(0,1)
contacts.ComputeNormalsOn()
contacts.Update()
result = contacts.GetOutput()
2 个回答
0
虽然这个问题已经有点时间了,但我遇到了一个非常相似的问题。
正如YC.Chui在他的评论中提到的,我们需要在读取的数据中设置标量值。对我来说,这样做解决了我的问题:
reader = vtk.vtkXMLImageDataReader()
reader.SetFileName('model_name.vti')
reader.Update()
readData = reader.GetOutput()
readData.GetPointData().SetScalars(readData.GetPointData().GetArray(0))
我对VTK还很陌生,完全不知道为什么这样做能解决问题,也不确定有没有更好的方法。如果你有意见或者建议,欢迎留言纠正我!
1
如果你想在Python和NumPy的环境中实现这个功能,我建议你使用这里的marching cubes(行进立方体)实现方法(或者看看pyqtgraph、mayavi中的等值面功能)。虽然有很多关于如何在VTK和其他工具之间移动数据的教程,但如果你已经在使用NumPy编程,我建议不要把这两种方法混在一起。