问题描述
我的目的是使用以下命令让vtkpolyData(通过vtk OBJ导入理想地着色/纹理化)传递给k3d查看器;
k3d.vtk_poly_data(<vtkpolyData>)
vtkGLTFReader提供了一个vtkMultiBlock,可以轻松地对其进行迭代以访问多个vtkpolyData对象,如图here所示。
另一方面,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
- 是否可以访问各个vtkpolyData对象 从.OBJ中删除而没有将.OBJ拆分为多个文件?
- 是从vtk python访问的数据的vtkMultiBlock版本 模块?还是只能通过here 中所述的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()
解决方法
您正在用导入器和渲染器向正确的方向看。 渲染器对象包含actor,每个actor都有一个映射器,该映射器包含一个多数据作为输入。
请参见以下cxx示例(python API相同,不同之处在于您可以直接通过renderer.GetActors()
进行迭代):https://lorensen.github.io/VTKExamples/site/Cxx/IO/OBJImporter/