如何解决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
- 是否可以访问各个vtkPolyData对象 从.OBJ中删除而没有将.OBJ拆分为多个文件?
- 是从vtk python访问的数据的vtkMultiBlock版本 模块?还是只能通过here 中所述的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/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。