我正在使用 QGLWidget 和 QtOpenGL 来显示我的点云,并使用 glReadPixels 和 gluUnProject 从点云中选择一个点。问题是 glReadPixels 似乎没有选择我点的像素。
我尝试在 glReadPixels 中使用不同的点大小以及不同的块大小,但“射线”似乎穿过这些点。我想知道我是否需要计算光线的关闭点,因为它几乎不可能在该点上单击。
这些点是用(只是 origon 中的一个点的例子)绘制的
`
GLuint list = glGenLists(1);
glNewList(list, GL_COMPILE);
glPointSize(10.0f);
glBegin(GL_POINTS);
glColor3f(0.0f, 255.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glEnd();
glEndList();
updateScene();`
点拾取由下面的 getObejctCoords 函数完成。
`
void pclView::getObjectCoords(QMouseEvent *event)
GLdouble projection[16];
GLdouble modelView[16];
GLint viewPort[4];
GLdouble obj_coords0, obj_coords1, obj_coords2;
GLdouble pt_coords0, pt_coords1, pt_coords2;
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetDoublev(GL_MODELVIEW_MATRIX, modelView);
glGetIntegerv(GL_VIEWPORT, viewPort);
// Window parameters
winX = event->pos().x();
winY = viewPort[3] - event->pos().y();
// get Window Z
glReadPixels( event->pos().x(), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
// Unproject 2D click to 3D location
gluUnProject( winX, winY, winZ, modelView, projection, viewPort, &obj_coords0, &obj_coords1, &obj_coords2);
std::cout << "x: " << obj_coords0;
std::cout << " y: " << obj_coords1;
std::cout << " z: " << obj_coords2 << std::endl;
`
在相机位置 (0,0,-50) 旋转:(0, 0) (通过单击几乎在原点处的点(但在点上),该函数产生以下输出
´ x: 0 y: -0.578724 z: -950 `
实际结果应该(据我所知)应该是
x: 0 y: -0.578724 z: -0