我正试图从mlab.contour3d
图中获取三角化的vtkPolyData
。我使用mayavi
是因为它似乎是正确三角化最小曲面的最快方法。我需要它作为vtkPolyData
,因为我想将它保存为.stl文件。
这是我的代码的MWE:
import numpy as np
from mayavi import mlab
def fun(x, y, z):
return np.cos(x) + np.cos(y) + np.cos(z)
x, y, z = np.mgrid[-1:1:100j, -1:1:100j, -1:1:100j]
contour = mlab.contour3d(x, y, z, fun)
mlab.show()
然后,我从mayavi
得到的是一个已经使用VTK
(或tvtk
)进行了三角测量和显示的曲面,因此应该可以从中得到vtkPolyData
。但到目前为止,我找到的唯一方法是使用mlab.savefig(test.obj)
导出.obj文件(这很糟糕,因为每次打开mayavi
UI都需要时间来保存该文件),然后使用vtkOBJReader
再次导入该文件,这给了我想要的vtkPolyData
。
有人知道更直接的方法吗?
edit:为了进一步澄清我的问题:我可以从可视化中访问数据,例如使用mayavi.tools.pipeline.get_vtk_src()
,但它是以vtkImageData
的形式出现的。如果有人知道将其转换为vtkPolyData
的方法,那也是一个解决方案。
完全巧合的是,我找到了一个解决方案。
import numpy as np
from mayavi import mlab
def fun(x, y, z):
return np.cos(x) + np.cos(y) + np.cos(z)
x, y, z = np.mgrid[-1:1:100j, -1:1:100j, -1:1:100j]
contour = mlab.contour3d(x, y, z, fun)
actor = contour.actor.actors[0]
polydata = tvtk.to_vtk(actor.mapper.input) # solution
mlab.show()
诀窍似乎是从管道访问映射器,这是一个PolyDataMapper。然后我只使用tvtk.to_vtk()
函数,这样我就可以继续使用vtk
,至少目前我更喜欢tvtk
。