我正在使用vtk,pcl和qt开发c ++应用程序。
我将vtk与pcl一起使用,如下所示:
qt 用于用户界面: QVTKOpenGLWidget 是用于显示vtk的qt小部件 renderWindow“ vtkGenericOpenGLRenderWindow ”
pcl 以在渲染窗口上查看Pointcloud:IAM使用 pcl :: visualization :: PCLVisualizer类可在 renderWindow。
vtk ,将vtk窗口小部件(例如vtkBoxWidget2)添加到renderWindow。
此代码演示了我如何将vtk与pcl结合在一起:
QVTKOpenGLWidget *m_qvtkWidget = new QVTKOpenGLWidget;
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto _renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
ui->splitterVertical->addWidget(m_qvtkWidget);
_renderWindow->AddRenderer(renderer);
pcl::visualization::PCLVisualizer::Ptr m_pclViewer;
m_pclViewer.reset(new pcl::visualization::PCLVisualizer(renderer, _renderWindow, "viewer", false));
仅当我具有纯vtk RenderWindow(未与pcl查看器结合使用)时,我才能执行以下操作: 使用vtkActorCollection将我的RenderWindow actor添加到新的renderWindow 像这样的课程:
for (int i = 0; i < renderWindowRight->GetRenderers()->GetFirstRenderer()->GetActors()->GetReferenceCount(); i++) {
auto Actor = renderWindowRight->GetRenderers()->GetFirstRenderer()->GetActors()->GetNextActor();
Actor->GetProperty()->SetColor(12,15,15);
renderWindowLeft->GetRenderers()->GetFirstRenderer()->AddActor(Actor);}
因为我有在其中设置了renderWindow的PclViewer,所以以前的代码没有 工作。
我尝试过的内容:
1-获取pclShapeActorMap并在两个pclViewers中使用相同的vtkProps:
auto ShapeActorMap = m_pclViewer->getShapeActorMap();
// m_pclViewer is my main pcl viewer
// m_pclViewportViewer is viewport pcl viewer
for (auto it = ShapeActorMap->begin(); it != ShapeActorMap->end(); ++it) {
it->second->ShallowCopy(it->second);
m_pclViewportViewer->getRendererCollection()->GetFirstRenderer()- >SetViewport(viewport);}
这也不起作用,我在pclViewer中得到了奇怪的输出,这两个图像描述了输出:
both pclViewers after calling previous code:
2-在两个PclViewer之间共享VtkRenderers:
auto renderer = m_pclViewer->getRendererCollection()->GetFirstRenderer();
m_pclViewportViewer->getRenderWindow()->AddRenderer(renderer);
Image of the ui 在这里,新视口的pclViewer可以正常工作,但原始pclViewer会冻结。