2013-02-25 142 views
0

我爲我的矩陣數學使用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爲負數。看起來很奇怪。

回答

0

愚蠢的問題。 unProject應該採用2D視圖矩陣而不是3D視圖矩陣。問題解決了。