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

2023-12-12

我的目的是获得 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 版本 模块?或者这只能通过如上所述的 js 版本的 vtk 实现here

由于 vtkImporter 类取代了 vtkReader 类并且已经正确显示带有材质(.mtl)的对象,我怀疑有一种方法可以通过 Render_Window 对象访问几何图形,但我无法管理它。

SOLUTION;

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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vtkOBJReader 将 OBJ 作为单独的 vtkPolyData 对象导入 的相关文章

随机推荐