glm::unProject 将鼠标位置转换为 3 个坐标

Posted

技术标签:

【中文标题】glm::unProject 将鼠标位置转换为 3 个坐标【英文标题】:glm::unProject to convert mouse position to 3 coordinates 【发布时间】:2013-02-25 05:16:45 【问题描述】:

我正在使用 OpenGL 3.2 + GLM 进行矩阵数学运算。以下是我的代码:

GLint viewport[4];
GLfloat winZ;

glGetIntegerv(GL_VIEWPORT,viewport);
glBindFramebuffer(GL_FRAMEBUFFER,fbo);
glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&winZ);
glBindFramebuffer(GL_FRAMEBUFFER,0);

glm::vec3 screen=glm::vec3(x,viewport[3]-y,winZ);
glm::mat4 view=glm::lookAt(glm::vec3(camera.x,camera.y,camera.z),glm::vec3(0,0,0),glm::vec3(0,1,0));
glm::mat4 projection=glm::perspective(90.0f,(float)viewport[2]/(float)viewport[3],10.0f,500.0f);

glm::vec3 pos=glm::unProject(screen,view,projection,glm::vec4(0,0,viewport[2],viewport[3]));

return pos.x,pos.y,pos.z;

winZ 是正确的。当我单击模型时,它是 1.0 (zfar),当我单击模型时,它看起来与我预期的相似。但是,返回值pos.z 不是我所期望的。当鼠标在背景上时:如果它朝向中心,pos.z 会变小,当它在屏幕边缘时,pos.z 是 zfar。谁能解释一下?

我遇到的实际问题是pos.xpos.y 没有返回我期望的以太。我的模型是 4.88 单位宽,但 unProject 说它大约是 20 单位宽? (如果我添加悬停在左侧和右侧的值)。

哦,屏幕中心是 0,0,正如预期的那样。


编辑:我还应该注意返回的pos.z 取决于鼠标从屏幕中心的位置。当它位于模型顶部时,它确实会变为更高的数字。如果光标的 Y 位置在屏幕中心上方,则pos.z 为正。如果 Y-pos 低于,pos.z 为负数。看起来真的很奇怪。

【问题讨论】:

【参考方案1】:

愚蠢的问题。 unProject 应该采用 2d 视图矩阵而不是 3d 视图矩阵。问题解决了。

【讨论】:

以上是关于glm::unProject 将鼠标位置转换为 3 个坐标的主要内容,如果未能解决你的问题,请参考以下文章

glm::unProject 问题,世界到屏幕空间对齐错误

窗口调整大小后将鼠标位置转换为 2D openGL 中的世界坐标

从鼠标位置缩放和翻译图像

将鼠标坐标转换为世界空间坐标

怎么将网页转换成Word

OpenGL 射线 OBB 相交