C++ OpenGL:gluUnProject的结果不是预期的结果

C++ OpenGL:gluUnProject的结果不是预期的结果,c++,opengl,C++,Opengl,我正在绘制z=0的纹理,如下图所示: 我的近平面和远平面设置分别为0.001和120.0。我可以用键盘移动和放大缩小 我想要的是在使用gluunproject时识别鼠标光标位置的世界位置(例如,图像中的红色) 问题:posX、posY和posZ的结果有些接近,但不正确。例如,对于可见视图的中心(蓝色),我得到posX=8.90000,posY=53.80000。但是如果我把鼠标移到左边,我会得到posX=8.89894(应该是3.xx)。如果向右移动光标,则得到的是8.90103,而不是大约1

我正在绘制z=0的纹理,如下图所示:

我的近平面和远平面设置分别为0.001和120.0。我可以用键盘移动和放大缩小

我想要的是在使用gluunproject时识别鼠标光标位置的世界位置(例如,图像中的红色)

问题:posX、posY和posZ的结果有些接近,但不正确。例如,对于可见视图的中心(蓝色),我得到posX=8.90000,posY=53.80000。但是如果我把鼠标移到左边,我会得到posX=8.89894(应该是3.xx)。如果向右移动光标,则得到的是8.90103,而不是大约14-16

这是我的密码: 这里可能有什么问题?

要“取消投影”某些内容,需要窗口空间
x
y
z
。 几乎可以肯定m_posWorld.z不在窗口空间中

窗口空间
z
是深度缓冲区存储的内容,它是介于[0.01.0]之间的值(假设默认深度范围)。因为深度缓冲区提供了这个值,所以您可以通过读回
(winX,winY)
(尽管性能会受到影响)中的深度缓冲区来轻松找到它

可以将世界空间坐标转换为窗口空间: 上面讨论的方法会更快,但需要一些矩阵数学。您目前完全依赖OpenGL本身来为您进行矩阵运算,如果您想继续这样做,您唯一的选择将是读回深度缓冲区:

GLfloat winZ;
glReadPixels (winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

无意冒犯,但你是如何在不知道如何链接到粘贴箱获取代码的情况下赢得这么多声誉和金质徽章的?(我已经为您解决了这个问题)。谢谢您的回复。winZ似乎总是“1”?如果我使用glhUnProjectf中glReadPixels获得的winZ,则posZ将变为负值。示例:posWorld.z为4->posZ约为-116,即-(120.00-4)(120是我的zFar值)。posX和posY包含“当前视图”的奇怪值,例如x->[-114131]和y[-20130]。如果我在glhUnProjectf中使用负的winZ值,posZ几乎等于posWorldZ,posX和posY接近真实值,但其行为与我最初的帖子中的行为类似(只有4.或5.小数位改变)。有什么想法吗?@Anonymous:如果您添加了
glEnable(GL\u DEPTH\u TEST)
。没有该选项,将不会向深度缓冲区写入任何内容;)至于获取负的对象空间Z坐标,这是一种预期,因为OpenGL中的默认投影矩阵会反转Z轴。我的初始化例程包含以下调用:glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);峡谷(GL_深度);我的想法快用完了。。。如果我提供简化版本的Qt Creator项目,会有帮助吗?
vec4 posClip  = projectionMatrix * viewMatrix * m_posWorld; // Project to clip-space
vec4 posNDC   = posClip / posClip.w;                        // Perspective Divide
float winZ    = (posNDC * vec4 (0.5) + vec4 (0.5)).z;       // Adjust for Depth Range
GLfloat winZ;
glReadPixels (winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);