0

我正在构建一个用于操作点云的简单工具。我希望能够在鼠标移动时进行多边形选择。我正在 Ubuntu 12.04 中使用 VTK 5.10 和 QVTKWidget。

为此,我通过修改测试文件构建了一个 polygonalSelector 类:https://github.com/Kitware/VTK/blob/master/Rendering/Core/Testing/Cxx/TestPolygonSelection.cxx 上的 TestPolygonSelection.cxx 修改是那些需要使用 VTK 5.10 而不是 vtk 6,如下所述:(请注意,我需要使用旧版本)http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Replacement_of_SetInput

在代码中,绘制了一个多边形,然后将 vtkHardwareSelector 对象vtkNew<vtkHardwareSelector> hardSel;用于其 GeneratePolygonSelection 方法:

我遇到的问题是测试下一个条件时:

if (hardSel->CaptureBuffers())

在内部,CaptureBuffers() 包含执行此操作的代码:

  vtkRenderWindow *rwin = this->Renderer->GetRenderWindow();
  int rgba[4];
  rwin->GetColorBufferSizes(rgba);
  if (rgba[0] < 8 || rgba[1] < 8 || rgba[2] < 8)
  {
    vtkErrorMacro("Color buffer depth must be atleast 8 bit. "
      "Currently: " << rgba[0] << ", " << rgba[1] << ", " <<rgba[2]);
    return false;
  }

我永远不会超过这一点,因为它总是返回错误。我不知道如何设置 ColorBufferSizes,也无法在网上找到信息来清除这一点。这是错误输出:

  vtkHardwareSelector (0x168dcd0): Color buffer depth must be atleast 8 bit. Currently: 17727456, 0, 23649488

在调试时,rgba int 永远不会改变(它在调用之前和之后保持不变rwin->GetColorBufferSizes(rgba))。

在 vtkRenderWindow 的文档中,它指出:

virtual int vtkRenderWindow::GetColorBufferSizes    (   int *   rgba    )
Get the size of the color buffer. Returns 0 if not able to determine otherwise sets R G B and A into buffer.

Implemented in vtkOpenGLRenderWindow, and vtkOpenGLRenderWindow.

我需要使用 vtkOpenGLRenderWindow 吗?在其类参考中,它声明“应用程序程序员通常应该使用 vtkRenderWindow 而不是 OpenGL 特定版本。”

有任何想法吗?

编辑

我相信问题源于 VTK 5.10 与 VTK 6 的差异。

我确实设法使用不同的方法来实现多边形选择。如果有人打算在未来实现某种多边形选择,他们可能会发现这些步骤很有用:

我对 vtkInteractorStyleDrawPolygon 进行了子类化,并在 OnLeftButtonUp() 方法中实现了以下步骤:

  1. 获得按钮释放积分:std::vector<vtkVector2i> points = this->GetPolygonPoints();

  2. 向 vtkDoubleArray 插入点

  3. 将 vtkDoubleArray 插入 vtkPolygon

  4. 获取多边形的 numPoints、法线和边界。

  5. 获取指向多边形数据 pts 内的双精度数组的指针。

    pts = static_cast<double*>(polygon->GetPoints()->GetData()->GetVoidPointer(0);
    
  6. 对于 vtkPolyData 中的每个点 P,请执行以下操作:

    inside = polygon->PointInPolygon(P,numPoints, pts, bounds,normal)
    
  7. 在内部 == 1 时将点添加到 vtkSelection

4

0 回答 0