如何从屏幕坐标获取世界坐标
How to get world coordinates from the screen coordinates
我正在尝试从屏幕坐标获取世界坐标。
这是我的流程。
鼠标点击获取屏幕坐标
将投影与视图矩阵相乘
FinalMatrix = projectionMatrix * viewMatrix;
3)逆矩阵
finalMatrix = glm::inverse(finalMatrix);
获取世界坐标中的位置
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;
另见 。
我正在尝试从屏幕坐标获取世界坐标。
这是我的流程。
鼠标点击获取屏幕坐标
将投影与视图矩阵相乘
FinalMatrix = projectionMatrix * viewMatrix;
3)逆矩阵
finalMatrix = glm::inverse(finalMatrix);
获取世界坐标中的位置
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;
另见