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
- Можно ли получить доступ к отдельным объектам vtkPolyData из.OBJ без разделения.OBJ на несколько файлов?
- Доступна ли версия данных 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/