JayNicht 2023-03-08 19:47 采纳率: 28.6%
浏览 97
已结题

VTK只实时更新点云,却不更新图片Actor

在项目中使用QVTKOpenGLNativeWidget来显示点云模型。
目前遇到的问题时,使用

VTKRenderWindow->Render();

我本来以为我遇到的问题是VTK不会实时更新,必须要我每次都拖动一下VTK窗口,更改一下视角他才会更新。后来我发现问题不在于此,我再项目中VTK窗口即需要展示点云

    pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
    cloud->points.push_back(PointT(0,0,0));
    renderWindowVTK->AddRenderer(rendererVTK);
    viewer.reset(new pcl::visualization::PCLVisualizer(rendererVTK, renderWindowVTK, "viewer", false));

又需要增加图片

    vtkSmartPointer<vtkPlaneSource> plane = vtkSmartPointer<vtkPlaneSource>::New();
    plane->SetCenter(0, 0, 0);
    plane->SetOrigin(-10,-10,0);
    plane->SetPoint1(10,-10,0);
    plane->SetPoint2(-10,10,0);
    plane->SetNormal(0, 0, 1);

    vtkSmartPointer<vtkTextureMapToPlane> texturePlane = vtkSmartPointer<vtkTextureMapToPlane>::New();
    texturePlane->SetInputConnection(plane->GetOutputPort());

    vtkSmartPointer<vtkPolyDataMapper> planeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    planeMapper->SetInputConnection(texturePlane->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    //中间省略一些操作
    rendererVTK->AddActor(actor);

然后我用

VTKRenderWindow->Render();

来更新VTK渲染时,只更新了PCL点云的渲染,也就是PCLvisualization的渲染,所以点云是永远实时更新的,但是图片的actor,却并不能实时更新,非要我点击VTK窗口后,他才会更新。
请问为什么会出现这个问题,是因为VTKRenderWindow->Render();语句并不会更新所有的actor吗。

  • 写回答

5条回答 默认 最新

  • 「已注销」 2023-03-08 19:50
    关注

    “Devil组”引证GPT后的撰写:

    • 我发现是同时使用了VTK和PCL库,其中VTK用于渲染图像,PCL用于渲染点云。在VTK中,用vtkRenderWindow->Render()命令可以触发渲染窗口,但它只会更新当前VTK Renderer中的Actor,而不会更新其他Renderer中的Actor。在代码中,添加了一个PCL Renderer和一个VTK Renderer,但只将VTK Renderer添加到了vtkRenderWindow中,因此当使用vtkRenderWindow->Render()时,只会更新VTK Renderer中的Actor,而不会更新PCL Renderer中的Actor。

    为了解决这个问题,要在调用vtkRenderWindow->Render()之前,先将PCL Renderer也添加到vtkRenderWindow中,如下所示:

    renderWindowVTK->AddRenderer(rendererPCL); //将PCL Renderer添加到vtkRenderWindow中
    renderWindowVTK->AddRenderer(rendererVTK); //将VTK Renderer添加到vtkRenderWindow中
    VTKRenderWindow->Render(); //更新vtkRenderWindow,同时更新所有Renderer中的Actor
    
    
    

    这样,调用vtkRenderWindow->Render()命令就可以更新PCL Renderer和VTK Renderer中的所有Actor了。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 创建了问题 3月8日