c++ - 屏幕空间到世界空间

标签 c++ opengl glm-math

我正在用 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/

相关文章:

c++ - 代码分析在 VS 2010 中不起作用

c++ - 带花括号的for循环中迭代器的openMP初始化

c++ - OpenGL 让物体粘在相机上

c++ - 为什么我在屏幕上显示了一半的三角形?

c++ - 为 glm 翻译添加统一 vector 在 OpenGL 中不起作用

c++ - 用列号 boost spirit 动态词法分析器?

c++ - 父进程和子进程计时

c++ - 从 GLU Tesselator 接收 GLU_TESS_ERROR_5

c++ - Qt/QML/OpenGL : Z-ordering doesn't work with semi-transparent items with OpenGL under QML

opengl - 片段着色器 GLSL 中的颜色插值?