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

时间:2013-02-25 05:16:46

标签: c++ opengl glm-math

我正在使用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位于屏幕中心上方,则pos.z为正。如果Y-pos低于,则pos.z为负数。似乎非常奇怪。

1 个答案:

答案 0 :(得分:0)

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