vtkOBJReader将OBJ导入为单个vtkPolyData对象

问题描述

我的目的是使用以下命令让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
  1. 是否可以访问各个vtkpolyData对象 从.OBJ中删除而没有将.OBJ拆分为多个文件
  2. 是从vtk python访问的数据的vtkMultiBlock版本 模块?还是只能通过here
  3. 中所述的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/