You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用cglm的glm_project函数时,相机旋转后屏幕坐标反转问题求助

使用cglm的glm_project函数时,相机旋转后屏幕坐标反转问题求助

嘿,我看了你的问题,这情况我之前用cglm做3D拾取功能的时候也碰到过!先帮你拆解下可能的问题点,一步步来排查:

首先,我怀疑你调用glm_project时的参数传递逻辑错了!先回忆下cglm里glm_project的设计思路:它是按「世界空间 → 视图空间 → 裁剪空间 → 屏幕空间」的流程转换点坐标的,而你现在直接把合并后的VP矩阵(proj * view)传给第二个参数,这大概率是核心问题!

cglm的glm_project大多需要分开传入视图矩阵投影矩阵,而不是提前合并的VP矩阵。你可以试试这么改:

  1. 先定义一个单位模型矩阵(你的点已经在世界空间,模型空间转世界空间用单位矩阵就行):
mat4 model = GLM_MAT4_IDENTITY_INIT;
  1. 调整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

火山引擎 最新活动