vtkOBJReader 将 OBJ 导入为单独的 vtkPolyData 对象

vtkOBJReader import OBJ as individual vtkPolyData objects

我的目的是让 vtkPolyData(理想情况下 colored/textured 通过 vtk OBJ 导入)传递给 k3d 查看器使用;

k3d.vtk_poly_data(<vtkPolyData>)

vtkGLTFReader 提供了一个 vtkMultiBlock,它可以很容易地迭代以访问多个 vtkPolyData 对象,如图所示 here?

另一方面,vtkOBJReader returns 一个 vtkPolyData 对象,它包含一个对象中的所有对象。所以我失去了对单个对象及其 guids/ids;

的引用
reader = vtk.vtkOBJReader() 
reader.SetFileName('Sample.obj')
reader.Update() 
vtkPolyData = reader.GetOutput() #Problem! all .OBJ elements in one vtkPolyData instance
  1. 是否可以访问单个 vtkPolyData 对象 从 .OBJ 中提取而不将 .OBJ 拆分为多个文件?
  2. 是可从 vtk python 访问数据的 vtkMultiBlock 版本 模块?或者这是否只能通过 vtk 的 js 版本实现 here

由于 vtkImporter class 取代了 vtkReader class 并且已经使用 material (.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() 

您正在寻找导入器和渲染器的正确方向。 渲染器对象包含演员,每个演员都有一个包含多数据作为输入的映射器。

看这个cxx例子(python API是一样的,只是你可以直接遍历renderer.GetActors()):https://lorensen.github.io/VTKExamples/site/Cxx/IO/OBJImporter/