如何用CGLM实现GLM中glm::angleAxis的相机旋转功能?
用CGLM复现GLM的轴角旋转相机逻辑
你给出的GLM代码通过轴角四元数生成俯仰、偏航旋转,再转换为矩阵相乘得到最终相机旋转矩阵。CGLM中没有同名的angleAxis函数,但可以用内置的glm_quatv实现完全等效的功能,具体代码如下:
等效CGLM实现
#include <cglm/cglm.h> // 生成相机旋转矩阵,参数pitch和yaw为弧度值 void camera_get_rotation(float pitch, float yaw, mat4 dest) { quat pitchQuat, yawQuat; mat4 pitchMat, yawMat; // 生成绕X轴的俯仰旋转四元数 glm_quatv(pitchQuat, pitch, (vec3){1.0f, 0.0f, 0.0f}); // 生成绕Y轴负方向的偏航旋转四元数 glm_quatv(yawQuat, yaw, (vec3){0.0f, -1.0f, 0.0f}); // 将四元数转换为4x4旋转矩阵 glm_quat_mat4(pitchQuat, pitchMat); glm_quat_mat4(yawQuat, yawMat); // 矩阵相乘:yaw旋转矩阵 左乘 pitch旋转矩阵,结果存入dest glm_mat4_mul(yawMat, pitchMat, dest); }
关键细节说明
glm_quatv的作用:这是CGLM中对应glm::angleAxis的函数,接收旋转角度(弧度)和旋转轴向量,直接生成对应的四元数。- 矩阵乘法顺序:CGLM和GLM默认都使用列主矩阵,因此保持原GLM的乘法顺序(yaw矩阵左乘pitch矩阵)即可得到相同的旋转效果。
- 参数类型注意:如果你的俯仰/偏航角是度数,需要先用
glm_rad()转换为弧度,例如pitch = glm_rad(30.0f)。 - 内存操作:CGLM直接操作栈上的数组类型(
quat是float[4],mat4是float[16]),不需要额外的内存分配,函数中直接传入目标矩阵dest即可避免返回数组的问题。
内容的提问来源于stack exchange,提问作者Sirox
相关产品推荐
相关产品推荐

