glRotatef如何绕局部轴旋转?自定义双精度旋转矩阵与glRotatef结果不一致如何解决?
问题原因与解决方法
你遇到的结果差异本质是矩阵乘法顺序不符合OpenGL的变换约定,你的旋转矩阵存储布局符合OpenGL列主序规范,不需要调整元素赋值逻辑。
glRotate的核心实现逻辑
OpenGL默认使用列主序矩阵、列向量的变换规则,所有变换操作都是将新生成的变换矩阵左乘到当前矩阵上,等价于在当前矩阵对应的局部坐标系下执行变换,不需要手动修改输入的旋转轴。
你现有代码的问题
你当前的矩阵乘法逻辑是 out = in * rotMat,也就是将旋转矩阵右乘到输入矩阵上,等价于先执行旋转、再执行输入矩阵的原有变换,所有旋转都会绑定全局坐标系,自然和glRotate的结果不一致。
两种可行的修复方案
方案1:直接调整矩阵乘法顺序
如果你的multiply_double_matrices(a, b, out)实现的是out = a * b的逻辑,只需要调换乘法行的参数顺序即可,改动最小:
把原代码中的:
multiply_double_matrices(in, rotMat, out);
修改为:
multiply_double_matrices(rotMat, in, out);
方案2:将局部旋转轴转换为全局空间轴
和你猜测的修改思路一致,如果你不想调整乘法顺序,可以在归一化旋转轴之前,先把输入的局部轴通过输入矩阵的3x3旋转部分转换为全局空间下的轴,再构造旋转矩阵:
在x /= mag;代码前添加如下逻辑:
// 把输入的局部坐标系旋转轴转换为全局坐标系轴 double ax = x, ay = y, az = z; x = in[0] * ax + in[4] * ay + in[8] * az; y = in[1] * ax + in[5] * ay + in[9] * az; z = in[2] * ax + in[6] * ay + in[10] * az;
两种方案都可以实现和glRotate完全一致的绕局部轴旋转的效果。
内容的提问来源于stack exchange,提问作者Exudes
相关产品推荐
相关产品推荐

