행렬 수학에 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.x
과 pos.y
이 내가 예상하는 것을 반환하지 않는다는 것입니다. 내 모델의 너비는 4.88이며, unProject
은 약 20 단위라고 말하고 있습니까? (만약 내가 왼쪽과 오른쪽에 떠오르게의 값을 추가).
아, 화면 중심이 예상대로 0,0입니다.
편집 : 나는 또한 반환 pos.z
가 화면의 중심에서 마우스의 위치에 따라 있음을 알아 두셔야합니다. 모델 상단에있을 때 훨씬 더 높은 수로 변경됩니다. 커서의 Y 위치가 화면 중앙보다 높으면 pos.z
이 양수입니다. Y-pos가 아래에 있으면 pos.z
이 음수입니다. 정말 이상하게 보입니다.