我的意图是让 vtkPolyData(通过 vtk OBJ 导入理想地着色/纹理)传递给 k3d 查看器使用;
k3d.vtk_poly_data(<vtkPolyData>)
vtkGLTFReader 提供了一个 vtkMultiBlock ,可以轻松地对其进行迭代以访问多个 vtkPolyData 对象,如此处所示?
另一方面,vtkOBJReader 返回一个 vtkPolyData 对象,该对象包含一个 obj 中的所有对象。因此,我失去了对单个对象及其 guid/id 的引用;
reader = vtk.vtkOBJReader()
reader.SetFileName('Sample.obj')
reader.Update()
vtkPolyData = reader.GetOutput() #Problem! all .OBJ elements in one vtkPolyData instance
- 是否可以在不将 .OBJ 拆分为多个文件的情况下从 .OBJ 访问各个 vtkPolyData 对象?
- 可以从 vtk python 模块访问数据的 vtkMultiBlock 版本吗?或者这只能通过此处描述的 js 版本的 vtk 实现
由于 vtkImporter 类取代了 vtkReader 类并且已经正确显示了具有材质 (.mtl) 的对象,我怀疑有一种方法可以通过 Render_Window 对象访问几何图形,但我无法管理这个。
解决方案;
importer = vtk.vtkOBJImporter()
importer.SetFileName('Sample.obj')
importer.SetFileNameMTL('Sample.mtl')
#preview with material using the importer
importer.Read()
importer.InitializeObjectBase()
importer.GetRenderer()
vtkRenderWindowInteractor = vtk.vtkRenderWindowInteractor()
Render_Window = importer.GetRenderWindow()
vtkRenderWindowInteractor.SetRenderWindow(Render_Window)
actors = Renderer.GetActors()
actors.InitTraversal() #Unpacks OBJ !
#Iterate over actors to get PolyData!
pds = []
for a in range(actors.GetNumberOfItems()):
actor = actors.GetNextActor()
# OBJImporter turns texture interpolation off
if actor.GetTexture():
actor.GetTexture().InterpolateOn()
pd = actor.GetMapper().GetInput()
#mapper = vtk.vtkPolyDataMapper(actor.GetMapper()) #Throws TypeError: Method requires a string argument!
mapper = actor.GetMapper() #use this in python
mapper.SetInputData(pd)
pds.append(pd)
vtkRenderWindowInteractor.Start()