4、三维旋转矩阵:绕单轴旋转的矩阵形式
好,咱们进入正题。
三维旋转,说白了就是让一个向量或者一个坐标系,绕着某根轴转个角度。你想想看,飞机在空中滚转、俯仰、偏航,本质上都是绕轴旋转。我当年刚接触飞控时,就被这些旋转矩阵搞得晕头转向。后来发现,只要把绕单轴的情况吃透,后面的组合旋转就水到渠成了。
4.1 绕X轴旋转
先看最简单的——绕X轴转。想象你面前有一根笔直的X轴,坐标系绕它旋转,Y轴和Z轴会怎么动?
嗯,这里要注意:Y和Z会像钟摆一样在YZ平面内画圆。旋转角度记为θ,正方向按右手定则——拇指指向X轴正方向,四指弯曲的方向就是正转方向。
绕X轴旋转的矩阵长这样:
R_x(θ) = [1 0 0 ]
[0 cosθ -sinθ ]
[0 sinθ cosθ ]
为什么第一行是[1, 0, 0]?因为绕X轴转,X坐标纹丝不动。我有个学生曾经问我:「老师,那Y和Z的符号怎么记?」我的笨办法是——你拿一支笔当X轴,另一支笔当Y轴,转一下看看。Y轴往Z轴方向转时,Y分量减少,所以是-sinθ。
关键点:绕X轴旋转时,X坐标不变。Y和Z坐标按二维旋转公式变化,但注意符号。
4.2 绕Y轴旋转
绕Y轴旋转,道理一样,但矩阵形式略有不同。我刚开始学的时候,总把绕Y轴的矩阵写错,后来发现一个规律——你只要记住「哪个轴不动,那行就是单位向量」。
绕Y轴旋转的矩阵:
R_y(θ) = [ cosθ 0 sinθ ]
[ 0 1 0 ]
[-sinθ 0 cosθ ]
你看,第二行是[0, 1, 0],因为Y轴不动。但注意!这里sinθ的符号位置和绕X轴不一样。绕X轴时,-sinθ在第二行第三列;绕Y轴时,-sinθ在第三行第一列。
为什么会这样?说白了,是因为坐标轴的排列顺序。X、Y、Z三个轴是循环对称的,但具体到矩阵里,符号位置会跟着轴走。我建议你直接记住这个结论:
- 绕X轴:-sinθ在(2,3)位置
- 绕Y轴:-sinθ在(3,1)位置
- 绕Z轴:-sinθ在(1,2)位置
这个规律我到现在还在用,从来没出过错。
小技巧:如果你记不住符号位置,可以用「循环置换」法。X→Y→Z→X,每次循环,-sinθ的位置就跟着往后挪一个维度。
4.3 绕Z轴旋转
绕Z轴旋转,是三个里面最直观的。因为Z轴通常指向上方,绕Z轴转就像转陀螺。X和Y在水平面内旋转。
矩阵形式:
R_z(θ) = [cosθ -sinθ 0]
[sinθ cosθ 0]
[ 0 0 1]
第三行[0, 0, 1],Z坐标不变。X和Y的变换,其实就是二维旋转矩阵的翻版。我在做飞行力学仿真时,绕Z轴的旋转用得最多——飞机的偏航运动就是绕Z轴转。
注意:这三个矩阵都是正交矩阵。什么意思?就是它们的逆矩阵等于转置矩阵。这个性质在后续做坐标反算时特别有用。我曾经在项目里直接用转置代替求逆,省了不少计算量。
4.4 三个矩阵的统一形式
其实,三个矩阵可以统一写成一种形式。我习惯这样记:
| 旋转轴 | 不动行 | -sinθ位置 |
|---|---|---|
| X轴 | 第1行 | (2,3) |
| Y轴 | 第2行 | (3,1) |
| Z轴 | 第3行 | (1,2) |
你发现没有?-sinθ的位置,正好是「不动行」的下一个维度。比如绕X轴,不动行是第1行,-sinθ就在(2,3);绕Y轴,不动行是第2行,-sinθ就在(3,1)。这个规律我百试百灵。
4.5 一个简单的例子
假设有一个点P,坐标是(1, 0, 0)。让它绕Z轴旋转90度,会得到什么?
代入R_z(90°):
R_z(90°) = [0 -1 0]
[1 0 0]
[0 0 1]
P' = R_z(90°) * [1, 0, 0]^T = [0, 1, 0]^T
结果P'变成了(0, 1, 0)。你想想看,原来在X轴正方向上的点,绕Z轴转90度后,跑到了Y轴正方向上。是不是很直观?
我当年做飞控算法验证时,就经常用这种简单例子来检查矩阵写没写对。一个点转90度,坐标应该正好互换,如果结果不对,那肯定是符号搞反了。
总结一下:
- 绕哪个轴转,哪个轴的坐标就不变
- -sinθ的位置有规律,记住循环置换法
- 三个矩阵都是正交矩阵,逆矩阵等于转置
- 用简单例子验证,90度旋转最直观
嗯,绕单轴旋转的矩阵就这些。别看简单,这是后面所有复杂旋转的基础。你把这些吃透了,欧拉角、四元数什么的,学起来就轻松多了。
这张图把三个旋转矩阵的核心特征都标出来了。你一眼就能看出:哪个轴不动、-sinθ在哪、旋转平面是什么。我建议你把它截图保存,以后写代码时对照着看,不容易出错。
避坑指南:我曾经在写飞控代码时,把绕Y轴的矩阵符号写反了,结果仿真出来的飞机一直在倒着飞。排查了半天才发现是-sinθ的位置搞错了。所以,写代码前先在纸上画个图,确认一下旋转方向。
好了,绕单轴旋转的矩阵就这些。内容不多,但很基础。你把这些吃透了,后面学欧拉角、方向余弦矩阵,就会觉得顺理成章。