2

我的意图是让 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
  1. 是否可以在不将 .OBJ 拆分为多个文件的情况下从 .OBJ 访问各个 vtkPolyData 对象?
  2. 可以从 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() 
4

1 回答 1

2

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

参见这个 cxx 示例(python API 相同,只是可以直接迭代renderer.GetActors()):https ://lorensen.github.io/VTKExamples/site/Cxx/IO/OBJImporter/

于 2020-09-09T14:14:57.533 回答