2012-01-08 68 views
2

我正在使用glm数学库来解决以下问题:将2D屏幕位置转换为3D世界空间。与GLM :: unProject在这种情况下,我希望worldPos为(0,0将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); 

现在:

在试图跟踪问题,我简单的代码如下1)。然而,它正在通过(127100.12,-95325.094,-95325.094)。

我误解了glm :: unProject应该做什么?我追踪了这个功能,它似乎工作正常。

回答

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。

+0

具有完美的感觉。谢谢 – JimFing 2012-01-09 20:57:23