使用cglm的glm_project函数时,相机旋转后屏幕坐标反转问题求助
嘿,我看了你的问题,这情况我之前用cglm做3D拾取功能的时候也碰到过!先帮你拆解下可能的问题点,一步步来排查:
首先,我怀疑你调用glm_project时的参数传递逻辑错了!先回忆下cglm里glm_project的设计思路:它是按「世界空间 → 视图空间 → 裁剪空间 → 屏幕空间」的流程转换点坐标的,而你现在直接把合并后的VP矩阵(proj * view)传给第二个参数,这大概率是核心问题!
cglm的glm_project大多需要分开传入视图矩阵和投影矩阵,而不是提前合并的VP矩阵。你可以试试这么改:
- 先定义一个单位模型矩阵(你的点已经在世界空间,模型空间转世界空间用单位矩阵就行):
mat4 model = GLM_MAT4_IDENTITY_INIT;
- 调整
glm_project的调用,把视图矩阵、投影矩阵分开传:
glm_project(world_pos, view, proj, viewport, screen);
我当初就是图省事把VP矩阵合并后传进去,结果相机一旋转坐标就反转,拆开参数后立刻就好了——因为glm_project内部会自己处理视图和投影的组合逻辑,提前合并会打乱它的坐标系转换步骤。
然后,再检查视口的坐标系匹配问题:cglm的glm_project默认输出的屏幕坐标系是y轴向下的,但很多渲染管线里我们习惯用y轴向上(比如窗口的y=0在顶部)。如果你的渲染逻辑是按y轴向上做的,那相机旋转后坐标反转很可能是这个坐标系不匹配导致的。你可以试试修改视口参数:
vec4 viewport = { 0, (f32)cam->cam.viewport_h, (f32)cam->cam.viewport_w, -(f32)cam->cam.viewport_h };
简单说就是把视口的y起始点设为窗口高度,高度设为负数,这样就能把glm_project输出的y轴方向反转过来,和你的渲染坐标系对齐。
另外,你的视图矩阵生成逻辑是对的——既然渲染时没问题,说明glm_quat_look生成的视图矩阵本身没毛病,问题肯定出在和glm_project的参数配合上。至于模型矩阵,你现在的点已经在世界空间,用单位矩阵就行,刚才的调整里已经覆盖了这个情况。
你可以先试试拆分VP矩阵这个操作,应该能解决大部分问题,如果还不行再调视口的y方向,我当初就是这么搞定的!
内容来源于stack exchange




