c++ - OpenGL坐标转换屏幕到世界

标签 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);

最佳答案

gluUnProject 获取窗口空间坐标并使用 world-view-projection-viewport 变换的逆向取消投影它们。它不知道坐标是否对应于现有对象。

当您清除深度缓冲区时,它会在所有地方被初始化为一个值,该值被 glReadPixels 读取为 1.0。

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

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

关于c++ - OpenGL坐标转换屏幕到世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372503/

相关文章:

c++ - glColor() 未在此范围内声明

c++ - 如何在 wchar_t* 和 int 之间转换?

c++ - 在 Linux 上编译的程序没有在#ifdef 部分获取代码

visual-studio - 在 Visual C++ Express Edition 中使用 GLUT

c++ - 非常量引用的无效初始化

c++ - 使用 resource.rc 中指定的不同语言构建应用程序

java - GLSL Shader 无法编译,Java 和 LWJGL 着色器错误

c++ - 带有自定义类指针的优先级队列断言错误

c++ - 如何创建具有未知成员函数的通用容器?

c++ - 如何使用 SimpleIni 返回 wchar_t 然后转换为 std::wstring?