行列の計算にOpenGL3.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.x
をpos.y
返さないことです。私のモデルの幅は4.88ユニットですが、幅unProject
は約20ユニットだと言っていますか?(左側と右側にホバリングの値を追加した場合)。
ああ、そして画面の中心は予想通り0.0です。
pos.z
編集:返されるのは画面の中央からのマウスの位置に依存することにも注意する必要があります。モデルの上にある場合は、はるかに高い数値に変更されます。カーソルのY位置が画面中央より上にある場合、pos.z
は正です。Y-posが下の場合、pos.z
は負です。本当に奇妙なようです。