2

我正在编写一个使用 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);
4

1 回答 1

0

gluUnProject获取窗口空间坐标并使用与世界视图投影视口变换相反的方式对它们进行非投影。它不知道坐标是否对应于现有对象。

当您清除深度缓冲区时,它在任何地方都被初始化为 1.0 和glReadPixels.

当对象的可见片段被绘制时,它们将通过深度测试,并为与这些片段相交的每个像素以较小的值覆盖深度值。

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

于 2013-06-29T02:45:09.947 回答