我正在写使用OpenGL一个MFC C++应用程序。该程序允许绘制和操作三维物体。现在我想找到坐标,在与我的对象相同的坐标空间中,在任何地方我点击屏幕上的鼠标。OpenGL的坐标变换Sceen到世界
到目前为止,我一直在使用glReadPixels和gluUnProject的组合,它一直在努力,但只有当我点击我的鼠标的地方在那里的对象已经被绘制。如果我点击物体外的任何地方,所获得的坐标都完全关闭。
所以我想知道如何改变我的代码,这样我可以找到坐标空间我的对象是在屏幕上的任何位置坐标。下面是我一直使用的代码:
GLint viewport[4];
GLdouble ox, oy, oz;//the coordinates I need
GLfloat winZ = 0.0;
::glGetIntegerv(GL_VIEWPORT, viewport);
::glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
::glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
GLfloat winX = (float)point.x;//point.x and point.y are the mouse coordinates
GLfloat winY = (float)viewport[3] - (float)point.y;
::glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)winZ, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz);
你的屏幕是2D的,你的世界是3D的。屏幕上的每个2D位置不是与3D点相对应,而是与射线/线/线段相对应。出于好奇,如果'winZ'是1,'gluUnProject'会返回什么? –
即使winZ为1,它也会每次返回1。请问您能详细说明每个2D点如何对应于射线/线/线段吗?什么是重要性和方向? –