我正在尝试从vtkPolyData
图获得三角化的mlab.contour3d
。我正在使用mayavi
,因为这似乎是对minimal surfaces进行正确三角剖分的最快方法。我需要将其作为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
,但以mayavi.tools.pipeline.get_vtk_src()
的形式出现。如果有人知道将其转换为vtkImageData
的方法,那也将是一个解决方案。 最佳答案
碰巧的是,我找到了解决方案。
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
。