我正在使用glm maths库来解决以下问题:将2d屏幕位置转换为3d世界空间。
为了追踪问题,我将代码简化为以下内容:
float screenW = 800.0f;
float screenH = 600.0f;
glm::vec4 viewport = glm::vec4(0.0f, 0.0f, screenW, screenH);
glm::mat4 tmpView(1.0f);
glm::mat4 tmpProj = glm::perspective( 90.0f, screenW/screenH, 0.1f, 100000.0f);
glm::vec3 screenPos = glm::vec3(0.0f, 0.0f, 1.0f);
glm::vec3 worldPos = glm::unProject(screenPos, tmpView, tmpProj, viewport);
现在使用glm :: unProject,我希望worldPos为(0,0,1)。然而它正在通过(127100.12,-95325.094,-95325.094)。
我误解了glm :: unProject应该做什么吗?我已经跟踪了这个功能,似乎工作正常。
答案 0 :(得分:3)
screenPos中的Z组件对应于深度缓冲区中的值。所以0.0f是近剪裁平面,1.0f是远剪裁平面。
如果你想找到离屏幕一个单位的世界pos,你可以重新缩放矢量:
worldPos = worldPos / (worldPos.z * -1.f);
另请注意,0,0的screenPos指定屏幕的左下角,而worldPos 0,0指示屏幕的中心。所以0,0,1应该给你-1.3333,-1,-1和400,300,1应该给你0,0,-1。