如何从屏幕坐标获取世界坐标

How to get world coordinates from the screen coordinates

我正在尝试从屏幕坐标获取世界坐标。

这是我的流程。

  1. 鼠标点击获取屏幕坐标

  2. 将投影与视图矩阵相乘

    FinalMatrix = projectionMatrix * viewMatrix;
    

3)逆矩阵

    finalMatrix = glm::inverse(finalMatrix);
  1. 获取世界坐标中的位置

    glm::vec4 worldPosition = finalMatrix * glm::vec4(screenPoint.x - 1920.0 / 2.0,  -1.0 * (screenPoint.y - 1080.0 / 2.0) , screenPoint.z, 1.0);
    

但是最终位置与鼠标点击的世界位置不匹配

我假设 screenPoint.xy 是鼠标在 window 坐标(像素)中的位置。 screenPoint.z 是深度缓冲区的深度。您必须将位置转换为标准化设备坐标。 NDC 在范围 (-1, -1, -1):

glm::vec3 fC = screenPoint;
glm::vec3 ndc = glm::vec3(fC.x / 1920.0, 1.0 - fC.y / 1080.0, fC.z) * 2.0 - 1.0;
glm::vec4 worldPosition = finalMatrix * glm::vec4(ndc, 1);

worldPosition 是一个 Homogeneous coordinates. You must divide it by it's w component to get a Cartesian coordinate (see Perspective divide):

glm::vec3 p = glm::vec3(worldPosition) / worldPosition.w;

另见