You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对cglm库中的vec3向量进行增量运算?

问题

我正在跟随一份OpenGL C教程学习,但用的是C语言,所以得用cglm库代替C的glm库。教程里有这样的向量操作代码:

glm::vec3 cameraPos   = glm::vec3(0.0f, 0.0f,  3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);

//...

const float cameraSpeed = 0.05f;

cameraPos += cameraSpeed * cameraFront;

但在C里这么写会报错,比如expression must have arithmetic type或expression must be a modifiable lvalue。我试了下面的写法但没解决:

vec3 cameraPos = {0.0f, 0.0f, 3.0f};
vec3 cameraFront = {0.0f, 0.0f, -1.0f};

//...

const float cameraSpeed = 0.05f;

vec3 b;
glm_vec3_mul((vec3) {cameraSpeed}, cameraFront, b);

glm_vec3_add(cameraPos, b, cameraPos);

我猜是glm_vec3_add()没法实现增量操作,想问cglm有没有能实现这个增量操作的函数?

解答

你之前的代码问题出在用错了标量乘向量的函数:glm_vec3_mul是用来做两个向量逐元素相乘的,而你需要的是标量乘以向量,应该用glm_vec3_scale。

另外,cglm确实提供了专门的增量操作函数,也有一步到位的函数来完成你要的cameraPos += 标量 * 向量操作:

方法1:分步实现(先缩放再增量)

用glm_vec3_scale完成标量乘向量,再用glm_vec3_add_self把结果直接加到cameraPos上(这个函数会直接修改第一个参数,也就是增量操作):

vec3 scaledFront;
glm_vec3_scale(cameraFront, cameraSpeed, scaledFront);
glm_vec3_add_self(cameraPos, scaledFront);

方法2:一步到位

用glm_vec3_scale_add直接完成“缩放向量后加到目标向量”的操作,更简洁:

glm_vec3_scale_add(cameraPos, cameraFront, cameraSpeed, cameraPos);

这个函数的参数顺序是:目标向量、要缩放的向量、标量、输出结果(这里直接传入cameraPos实现原地修改)。

另外补充:你之前用的glm_vec3_add其实也能实现,只要把第三个参数传成cameraPos就行,但前提是前面的缩放操作要正确。不过用add_self或者scale_add更符合cglm的使用习惯,也更直观。

内容的提问来源于stack exchange,提问作者Scollier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:47:08