OpenGL坐标转换屏幕到世界

时间:2013-06-28 19:45:25

标签: c++ visual-c++ opengl coordinate-transformation

我正在编写一个使用OpenGL的MFC c ++应用程序。该程序允许在3D中绘制和操纵对象。现在我想在我在屏幕上单击鼠标的任何地方找到我绘制对象的相同坐标空间中的坐标。

到目前为止,我一直在使用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);

1 个答案:

答案 0 :(得分:0)

gluUnProject获取窗口空间坐标,并使用world-view-projection-viewport转换的反转来取消它们。如果坐标对应于现有对象,它就不知道了。

当您清除深度缓冲区时,它会在任何地方初始化,其值为glReadPixels读取为1.0。

当绘制一个物体的可见碎片时,它们将通过深度测试,并且对于与这些碎片相交的每个像素,使用较小的值覆盖深度值。

这意味着每次读取深度缓冲区中的值为1.0的像素时,这意味着在该像素中没有绘制任何可见的内容,这就是您获得的结果完全关闭的位置。

相关问题