vtkOBJReader импортирует OBJ как отдельные объекты vtkPolyData

Я намерен передать vtkPolyData(видеале окрашенный / текстурированный с помощью импорта OBJ vtk) в программу просмотра k3d, используя;

k3d.vtk_poly_data(<vtkPolyData>)

vtkGLTFReader предоставляет vtkMultiBlock, который можно легко перебрать, чтобы получить доступ к нескольким объектам vtkPolyData, как показано здесь?

vtkOBJReader, с другой стороны, возвращает объект vtkPolyData, который охватывает все объекты в одном obj. Итак, я потерял ссылку на отдельные объекты и их идентификаторы / идентификаторы;

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. Доступна ли версия данных vtkMultiBlock из модуля vtk python? Или это возможно только через 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() 

1 ответ

Решение

Вы смотрите в правильном направлении с помощью средства импорта и средства визуализации. Объект рендерера содержит акторов, каждый из которых имеет преобразователь, содержащий полиданные в качестве входных данных.

См. Этот пример cxx (API python такой же, за исключением того, что вы можете напрямую выполнять итерацию renderer.GetActors()): https://lorensen.github.io/VTKExamples/site/Cxx/IO/OBJImporter/

Другие вопросы по тегам