【问题标题】:Does marching cubes in vtk require specific input?vtk 中的行进立方体是否需要特定的输入?
【发布时间】:2014-07-31 00:58:00
【问题描述】:

在我将 ImageData 传递给 Marching cubes 类后,它不会生成任何东西。

我正在尝试从 3D numpy 数组生成表面。我使用 evtk 将数组导出到 .vti(结构化点)文件并存储为 pointData。然后,通过 vtkXMLImageDataReader 读取文件。将 Reader 的输出(vtkImageData)传递给 vtkMarchingCubes 类后,该类返回一个没有点或单元的 vtkPolyData,vtkImageData 在 vtk wiki 的示例中使用,MarchingCubes 类应该没有问题处理它。

我尝试导出Reader生成的ImageData,输出可以通过ParaView可视化没有任何问题。

我只是想知道 vtk 中的行进立方体生成表面是否有任何特殊要求?如果 3D numpy 可以直接转换为适合 MarchingCubes 的数据类型就更好了。

这是我读取 .vki 文件并将其传递给行进立方体的代码:

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()

【问题讨论】:

  • 结果给你什么?
  • result 给了我一个空的 vtkPolyData。
  • 您指定的值是否可能对输入数据没有意义?
  • 数据范围为 [1,7]。我将输入与来自 vtk 的示例进行了比较。似乎 XMLImageDataReader 不会将 PointDataArray 转换为标量,而没有标量,MarchingCubes 将无法工作...
  • 听起来你回答了自己的问题

标签: python numpy vtk marching-cubes


【解决方案1】:

如果您希望在 python/numpy 世界中执行此操作,那么我建议使用来自 here 的行进立方体实现(或查看 pyqtgraph 中的等值面例程,mayavi ...)。虽然有很多关于将数据移入和移出 VTK 的教程,但如果您已经在使用 numpy 进行编程,我不会将这两种方法混用。

【讨论】:

    【解决方案2】:

    虽然这个问题已经很老了,但我遇到了一个非常相似的问题。

    正如 YC.Chui 在他的评论中指出的,我们需要在读取的数据中设置标量值。对我来说,这有帮助:

    reader = vtk.vtkXMLImageDataReader()
    reader.SetFileName('model_name.vti')
    reader.Update()
    
    readData = reader.GetOutput()
    readData.GetPointData().SetScalars(readData.GetPointData().GetArray(0))
    

    我对 VTK 很陌生,完全不知道为什么这可以解决问题以及是否有更好的方法。欢迎评论和纠正我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 2020-01-29
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多