我正在用 C++ 编写一个绘图程序,但不知道如何从屏幕空间转换为世界空间
我可以访问投影和 View 矩阵以及屏幕尺寸等
这是我正在使用的代码,但它不起作用
没有错误,但它根本不输出世界空间坐标,它只是稍微改变了所有像素坐标
我正在关注在这里找到的答案 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;
最佳答案
View 矩阵从世界空间转换为 View 空间。因此,逆 View 矩阵从 View 空间变换到世界空间。
投影矩阵将 View 空间变换为裁剪空间,并将逆投影矩阵从裁剪空间变换为 View 空间。剪辑空间是 Homogeneous coordinate系统。为了从剪辑空间转换到标准化设备空间,您必须执行 Perspective divide 。标准化设备空间为Cartesian coordinates系统。因此,如果要从归一化设备空间变换到 View 空间,则需要通过逆投影矩阵进行变换,并将 x、y、z 分量除以 w 分量。
另请参阅OpenGL - Mouse coordinates to Space coordinates
由于您使用的是 GLM,我建议使用 glm::unProject
用于转换。
关于c++ - 屏幕空间到世界空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65519789/