将2d屏幕位置投影到3d世界空间中

时间:2012-01-08 14:45:43

标签: c++ 3d glm-math

我正在使用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应该做什么吗?我已经跟踪了这个功能,似乎工作正常。

1 个答案:

答案 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。