vtk中的Marching Cubes是否需要特定输入?

1 投票
2 回答
2559 浏览
提问于 2025-04-18 15:26

我在使用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编程,我建议不要把这两种方法混在一起。

撰写回答