OpenGL: projecting mouse click onto geometry
我有这个视图集:
1 2 | glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective glLoadIdentity(); //Reset the drawing perspective |
我通过鼠标点击得到一个屏幕位置(sx,sy)。
给定z的值,如何从sx和sy计算三维空间中的x和y?
您应该使用
首先,计算"未投影"到近平面:
1 2 3 4 5 6 7 8 9 10 | GLdouble modelMatrix[16]; GLdouble projMatrix[16]; GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); GLdouble x, y, z; gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z); |
然后到远平面:
1 2 | // replace the above gluUnProject call with gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z); |
现在在世界坐标系中有一条线,可以追踪到所有可能点击的点。所以现在你只需要插入:假设你得到了z坐标:
1 2 3 4 5 6 7 8 9 10 | GLfloat nearv[3], farv[3]; // already computed as above if(nearv[2] == farv[2]) // this means we have no solutions return; GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]); // so here are the desired (x, y) coordinates GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t, y = nearv[1] + (farv[1] - nearv[1]) * t; |
这是最权威的来源,OpenGL的网站最好的回答。
这实际上取决于投影矩阵,而不是模型视图矩阵。http://www.toymaker.info/games/html/picking.html应该能帮你解决这个问题——它以d3d为中心,但理论是一样的。
不过,如果您想进行基于鼠标的拾取,我建议使用选择渲染模式。
编辑:请注意,模型视图矩阵确实发挥了作用,但由于您的是身份,所以这不是问题。
libqglviewer有一个很好的选择框架,如果这就是你想要的