我正在开发围绕MainWindow构建的Qt程序,其中包含qvtkWidget
。
我在qvtkWidget
内显示各种VTK对象,目的是在加载和渲染后改变它们。然后应将更改的数据集写入文件以供以后重用。
例如,我在生成前者并将其传递给vtkPointSource
的实例后显示vtkPolyDataMapper
的实例,它本身传递给vtkActor
的实例,它本身传递给vtkRenderer
的实例。然后将渲染器添加到qvtkWidget
并正确显示。
让我们假设现在希望将点云保存为.vtp文件。
一旦提供了表示正在显示的点云的vtkPolyData对象, vtkXMLPolyDataWriter
就可以做到这一点。
我以为我可以通过在MainWindow :: save()中执行以下操作来检索基础点云数据:
vtkRenderWindow * renderWindow = this->qvtkWidget->GetRenderWindow();
vtkRendererCollection * renderers = renderWindow-> GetRenderers();
vtkRenderer * renderer = renderers->GetFirstRenderer();
vtkActorCollection * actors = renderer->GetActors();
vtkActor * actor = actors->GetLastActor();
vtkPolyDataMapper * mapper = actor->GetMapper();
vtkSmartPointer<vtkPolyData> * polydata = mapper->GetInput()
vtkPolyDataMapper * mapper = actor->GetMapper();
发生了投射错误,考虑到vtkPolyDataMapper
和vtkMapper
之间的继承关系,这完全合理。
我想我可以改为将最后两行重写为
vtkMapper * mapper = actor->GetMapper();
vtkSmartPointer<vtkDataSet> * polydata = mapper->GetInput()
避免播放错误,但我完全不确定上述代码段是否符合VTK I / O标准。
这是一种正确的方法,用于在点云数据被更改后保存到文件中(即,以呈现的方式从渲染窗口转移到基础数据集)?