c++ - 屏幕空间到世界空间
问题描述
我正在用 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;
解决方案
视图矩阵从世界空间转换为视图空间。因此,逆视图矩阵从视图空间变换到世界空间。
投影矩阵从视图空间变换到剪辑空间,逆投影矩阵从剪辑空间变换到视图空间。剪辑空间是一个齐次坐标系。为了从剪辑空间转换到标准化设备空间,您必须进行透视除法。标准化的设备空间是笛卡尔坐标系。因此,如果要从归一化的设备空间变换到视图空间,则需要通过逆投影矩阵进行变换,并通过 w 分量将 x、y 和 z 分量相除。
另请参见OpenGL - 鼠标坐标到空间坐标
由于您使用的是 GLM,因此我建议您使用 glm::unProject
转换。
推荐阅读
- python-3.x - AttributeError:“dict”对象没有属性“_sa_instance_state”
- python - Pandas GroupBy 与每个连续组的 CumulativeSum
- sql - 如何返回日期和销售收入的 SQL 语句
- sql - 如果客户 ID 包含 7 天试用,则需要为所有客户 ID 选择所有订阅类型
- laravel - 如何在 laravel 单元测试中模拟 api 身份验证
- google-cloud-platform - 谷歌函数 HTTP 触发器 - 身份验证问题服务器到具有服务帐户的服务器
- javascript - 如何通过express js过滤动态对象
- jquery - 拖动元素上的Jquery Sortable
- firebase - Flutter Firebase Database child('.info/connected') 总是返回 true
- java - java中正则表达式的问题