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

问题描述:

我为我的矩阵数学使用OpenGL 3.2 + GLM。以下是我的代码:glm :: unProject将鼠标位置转换为3个坐标

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为负数。看起来很奇怪。

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