【问题标题】:vtkSelectVisiblePoints filter output has 0 pointsvtkSelectVisiblePoints 过滤器输出有 0 个点
【发布时间】:2016-09-05 14:05:52
【问题描述】:

我正在尝试获取仅包含 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-&gt;Render(),模型的可见部分会正确显示...

我错过了什么吗...?

【问题讨论】:

  • 问题在于,为了使点可见,您需要先渲染它们。
  • 确实,加上renderWindow->Render();然后选择VisiblePoints->Update(); ,点数正确显示。请发表您的评论作为回复,以便我接受。

标签: c++ vtk


【解决方案1】:

答案就在那里,在documentation of the filter

警告您必须仔细同步此过滤器的执行。 filter指的是一个renderer,每次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;

【讨论】:

    猜你喜欢
    • 2022-09-12
    • 2022-10-07
    • 1970-01-01
    • 2015-02-08
    • 2021-12-24
    • 1970-01-01
    • 2012-01-30
    • 2019-09-21
    • 2021-10-27
    相关资源
    最近更新 更多