Я использую 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
это зфар. Кто-нибудь может объяснить это?
Фактическая проблема, с которой я сталкиваюсь, заключается в том, что pos.x
а также pos.y
не возвращай то, что я ожидаю, эфир. Моя модель 4,88 единиц в ширину, но пока unProject
говорит, что это около 20 единиц в ширину? (если я добавлю значения зависания слева и справа).
Да, и центр экрана 0,0, как и ожидалось.
РЕДАКТИРОВАТЬ: Я также должен отметить, что вернулся pos.z
зависит от положения мыши от центра экрана. Он меняется на гораздо большее число, когда он на вершине модели. Если Y-позиция курсора выше центра экрана, pos.z
положительно. Если Y-pos ниже, pos.z
отрицательно. Кажется странным.
Глупый вопрос. unProject должен брать 2-мерную матрицу просмотра, а не 3-ю. Задача решена.
Других решений пока нет …