3、旋转矩阵推导:绕X/Y/Z轴旋转的矩阵推导,以及组合旋转的链式法则

好,咱们今天来聊聊旋转矩阵。这东西在数据回放、机器人控制、三维重建里,几乎天天见。说白了,它就是描述一个物体怎么在三维空间里转圈的数学工具。

我个人习惯,每次讲旋转矩阵,都会先从最简单的二维旋转开始想。你想想看,二维平面里一个点绕原点转个角度,坐标怎么变?

假设有个点 P(x, y),绕原点逆时针转 θ 角,到了 P'(x', y')。用三角函数一推:

x' = x·cosθ - y·sinθ
y' = x·sinθ + y·cosθ

写成矩阵形式就是:

[x']   [cosθ  -sinθ] [x]
[y'] = [sinθ   cosθ] [y]

嗯,二维搞明白了,三维就好办了。三维旋转,其实就是固定一个轴,在另外两个轴构成的平面里做二维旋转。

3.1 绕X轴旋转

绕X轴旋转时,X坐标不变。Y和Z在YZ平面里转。这就像你拿着一根棍子,让它绕着自己的长度方向转。

推导很简单:

  • x' = x
  • y' = y·cosθ - z·sinθ
  • z' = y·sinθ + z·cosθ

写成矩阵:

R_x(θ) = [1      0       0    ]
         [0    cosθ   -sinθ ]
         [0    sinθ    cosθ ]
我的小经验: 我在做机械臂末端姿态回放时,经常需要绕X轴调整工具角度。一开始我总搞混正负号,后来记住一个诀窍——用右手定则,拇指指向旋转轴正方向,四指弯曲方向就是正角度方向。

3.2 绕Y轴旋转

绕Y轴旋转时,Y坐标不变。X和Z在XZ平面里转。注意,这里的坐标顺序跟绕X轴有点不一样。

推导结果:

  • x' = x·cosθ + z·sinθ
  • y' = y
  • z' = -x·sinθ + z·cosθ

写成矩阵:

R_y(θ) = [cosθ   0    sinθ ]
         [0      1    0    ]
         [-sinθ  0    cosθ ]
注意! 绕Y轴旋转的矩阵里,sinθ 的符号位置跟绕X轴、绕Z轴不一样。我曾经在项目里因为抄错这个符号,导致回放出来的数据整个歪了90度,排查了半天才发现。所以写代码时一定要对着公式逐项检查。

3.3 绕Z轴旋转

绕Z轴旋转时,Z坐标不变。X和Y在XY平面里转。这个其实就是二维旋转的推广。

推导结果:

  • x' = x·cosθ - y·sinθ
  • y' = x·sinθ + y·cosθ
  • z' = z

写成矩阵:

R_z(θ) = [cosθ  -sinθ  0]
         [sinθ   cosθ  0]
         [0      0     1]

3.4 组合旋转与链式法则

实际应用中,很少只绕一个轴转。比如一个飞行器,它要同时调整俯仰、偏航、滚转。这时候就需要组合旋转。

组合旋转的核心规则是:后乘的矩阵先作用。什么意思?

假设你先绕X轴转 α 角,再绕Y轴转 β 角,最后绕Z轴转 γ 角。那么总的旋转矩阵是:

R = R_z(γ) · R_y(β) · R_x(α)

注意顺序!矩阵乘法不满足交换律。R_x · R_y 和 R_y · R_x 结果完全不同。

链式法则的本质: 每次旋转都是在当前坐标系下进行的。后一个旋转矩阵要左乘到前面已经得到的矩阵上。这就像你叠积木,每放一块,位置都是相对于当前已经叠好的部分。

举个例子,假设你要让一个摄像头先绕X轴转30°,再绕Y轴转45°:

R = R_y(45°) · R_x(30°)

R_x(30°) = [1      0       0    ]
           [0    cos30   -sin30 ]
           [0    sin30    cos30 ]

R_y(45°) = [cos45   0    sin45 ]
           [0       1    0     ]
           [-sin45  0    cos45 ]

最终 R = R_y(45°) · R_x(30°)
        = [cos45   sin45·sin30   sin45·cos30 ]
          [0       cos30        -sin30       ]
          [-sin45  cos45·sin30   cos45·cos30 ]

你看,结果矩阵里每个元素都是三角函数组合。这就是链式法则的威力——把多个旋转浓缩成一个矩阵。

避坑指南: 我曾经在写数据回放程序时,把旋转顺序搞反了。本应是“先绕X再绕Y”,我写成了“先绕Y再绕X”。结果回放出来的轨迹完全不对,物体在天上乱飞。后来我养成了一个习惯:在代码注释里明确写出旋转顺序和使用的约定(左乘还是右乘)。

3.5 知识体系一览

下面这张图帮你理清本章的核心逻辑:

旋转矩阵推导知识体系 绕X轴旋转 R_x(θ) X不变,YZ平面旋转 绕Y轴旋转 R_y(θ) Y不变,XZ平面旋转 绕Z轴旋转 R_z(θ) Z不变,XY平面旋转 组合旋转 R = R_z(γ) · R_y(β) · R_x(α) 链式法则:后乘先作用,顺序不可交换

从这张图可以清楚看到:三个基础旋转是砖块,组合旋转是墙,链式法则是砌墙的规则。没有规则,墙就会塌。

3.6 总结

绕X/Y/Z轴的旋转矩阵,本质上就是二维旋转在三维空间里的推广。记住三点:

  • 绕哪个轴,哪个轴的坐标就不变
  • 另外两个轴构成平面,做二维旋转
  • 注意绕Y轴时 sinθ 的符号位置不同

组合旋转时,链式法则告诉我们:矩阵乘法顺序就是旋转作用顺序。先做的旋转放在最右边,后做的放在最左边。这个顺序搞反了,结果就全错了。

嗯,旋转矩阵这块内容,理解透了后面学四元数、欧拉角都会轻松很多。建议你动手在纸上推一遍,再写几行代码验证一下,印象会深得多。

可可精品资料库