OpenGL:将鼠标单击投影到几何上
时间:2020-03-06 14:31:31 来源:igfitidea点击:
我设置了以下视图:
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective glLoadIdentity(); //Reset the drawing perspective
我通过单击鼠标得到屏幕位置(sx,sy)。
给定z值,如何从sx和sy计算3d空间中的x和y?
解决方案
libqglviewer有一个不错的选择框架,如果我们正在寻找的话
这实际上取决于投影矩阵,而不取决于模型视图矩阵。 http://www.toymaker.info/Games/html/picking.html应该可以-以D3D为中心,但是理论是相同的。
但是,如果我们要进行基于鼠标的拾取,建议我们使用选择渲染模式。
编辑:请注意,模型视图矩阵确实起作用,但是由于身份是身份,所以这不是问题。
最好的答案是最权威的信息来源OpenGL的网站。
我们应该使用gluUnProject
:
首先,计算到近平面的"非投影":
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);
然后到远处的飞机:
// replace the above gluUnProject call with gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);
现在,我们已经在世界坐标系中找到一条直线,该直线可以找出我们可能一直单击的所有可能的点。所以现在我们只需要插值:假设我们已获得z坐标:
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;