vtkSelectVisiblePoints过滤器输出有0个点

vtkSelectVisiblePoints filter output has 0 points

本文关键字:0个点 输出 过滤器 vtkSelectVisiblePoints      更新时间:2023-10-16

我试图仅获得3D模型的可见部分的polyData。在这种程度上,我通过vtkSelectVisiblePoints过滤器传递原始数据。

我使用模拟渲染器,映射器和演员,因为我想在显示它们之前对可见点进行后处理。

然而,由于某种原因,vtkSelectVisiblePoints过滤器的输出包含"0"点…

使用以下示例:http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/SelectVisiblePoints

我写了下面的代码:
  // Render window and interactor
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->SetSize(800, 800);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // Mock renderer, mapper and actor
  vtkSmartPointer<vtkRenderer> mockRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderWindow->AddRenderer(mockRenderer);
  vtkSmartPointer<vtkPolyDataMapper> mockMapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
  mockMapper->SetInput(reader->GetOutput());
  vtkSmartPointer<vtkActor> mockActor = vtkSmartPointer<vtkActor>::New();
  mockActor->SetMapper(mockMapper);
  mockRenderer->AddActor(mockActor);
  // Set camera to the correct position
  mockRenderer->GetActiveCamera()->SetPosition(0, -1, 0);
  mockRenderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);
  mockRenderer->GetActiveCamera()->SetViewUp(0, 1, 0);
  mockRenderer->ResetCamera();
  vtkSmartPointer<vtkSelectVisiblePoints> selectVisiblePoints =
    vtkSmartPointer<vtkSelectVisiblePoints>::New();
  selectVisiblePoints->SetInput(reader->GetOutput());
  selectVisiblePoints->SetRenderer(mockRenderer);
  selectVisiblePoints->Update();
  std::cout << "Visible nr of points = " << selectVisiblePoints->GetOutput()->GetNumberOfPoints() << std::endl;
  renderWindow->RemoveRenderer(mockRenderer);

…打印0.

然而,如果我调用renderWindow->Render(),模型的可见部分被正确显示…

我错过什么了吗?

答案就在那里,在过滤器的文档中:

警告必须小心地同步此过滤器的执行。过滤器引用渲染器,每次渲染时都会修改渲染器发生。因此,过滤器总是过时的,而且总是执行。您可能需要执行两次渲染传递

如果我添加//new行,它就像预期的那样工作,就像Arnas在他的评论中建议的那样:

  vtkSmartPointer<vtkSelectVisiblePoints> selectVisiblePoints = 
    vtkSmartPointer<vtkSelectVisiblePoints>::New();
  selectVisiblePoints->SetInput(originalData);
  selectVisiblePoints->SetRenderer(renderer);
  selectVisiblePoints->Update();
  renderWindow->Render(); // new
  selectVisiblePoints->Update(); // new
  std::cout << "Visible nr of points = " << selectVisiblePoints->GetOutput()->GetNumberOfPoints() << std::endl;