如何对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
相关产品推荐
相关产品推荐

