有没有一种方法可以在两个pclViewer之间共享vtkActors?

时间:2018-08-14 09:44:57

标签: c++ qt vtk point-cloud-library

我正在使用vtk,pcl和qt开发c ++应用程序。

  • 首先,我想知道在多个vtkRenderWindows之间共享相同的vtkActors是否安全。

我将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中得到了奇怪的输出,这两个图像描述了输出:

  • Main pclViewer before calling previous code:

  • 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会冻结。

  • 所以,如果这是安全的,我想知道是否有一种方法可以实现我想做的事情。

0 个答案:

没有答案