我正在构建一个操作点云的简单工具。我希望能够在鼠标移动时做多边形选择。 我在Ubuntu 12.04中使用VTK 5.10和QVTKWidget。
为此,我通过修改测试文件构建了polygonSelector类: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;
}
我从来没有超越这一点,因为它总是返回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吗? 在它的Class引用中,它声明&#34;应用程序程序员通常应该使用vtkRenderWindow而不是OpenGL特定版本。&#34;
有什么想法吗?
修改
我认为问题源于VTK 5.10与VTK 6的差异。
我确实设法使用不同的方法实现多边形选择。 如果有人打算将来实施某种多边形选择,他们可能会发现这些步骤很有用:
我对vtkInteractorStyleDrawPolygon进行了细分,并在OnLeftButtonUp()方法中实现了以下步骤:
在按钮发布时获取积分:std::vector<vtkVector2i> points = this->GetPolygonPoints();
将积分插入vtkDoubleArray
将vtkDoubleArray插入vtkPolygon
获取多边形的numPoints,normal和bounds。
获取指向多边形数据pts内的双数组的指针。
pts = static_cast<double*>(polygon->GetPoints()->GetData()->GetVoidPointer(0);
对于vtkPolyData中的每个点P,执行:
inside = polygon->PointInPolygon(P,numPoints, pts, bounds,normal)
当内部== 1