首页 > 解决方案 > 屏幕空间到世界空间

问题描述

我正在用 C++ 制作一个绘图程序,但不知道如何从屏幕空间转换到世界空间

我可以访问投影和视图矩阵以及屏幕尺寸等

这是我正在使用的代码,但它不起作用

没有错误,但它根本不输出世界空间坐标,它只是稍微改变了所有像素坐标

我正在关注我在这里找到的答案OpenGL Math - Projecting Screen space to World space coords

我现在只使用正交相机

glm::mat4 proj = cameraComp.Camera.GetProjection();
glm::mat4 view = glm::translate(glm::mat4(1.0f), transformComp.Position)
       * glm::rotate(glm::mat4(1.0f), glm::radians(transformComp.Rotation.z), glm::vec3(0, 0, 1));

glm::mat4 inversed = glm::inverse(proj * view);

glm::vec4 worldPos = { newMousePos, 0, 1 };
worldPos *= inversed;

标签: c++openglglm-math

解决方案


视图矩阵从世界空间转换为视图空间。因此,逆视图矩阵从视图空间变换到世界空间。
投影矩阵从视图空间变换到剪辑空间,逆投影矩阵从剪辑空间变换到视图空间。剪辑空间是一个齐次坐标系。为了从剪辑空间转换到标准化设备空间,您必须进行透视除法。标准化的设备空间是笛卡尔坐标系。因此,如果要从归一化的设备空间变换到视图空间,则需要通过逆投影矩阵进行变换,并通过 w 分量将 x、y 和 z 分量相除。
另请参见OpenGL - 鼠标坐标到空间坐标

由于您使用的是 GLM,因此我建议您使用 glm::unProject转换。


推荐阅读