好的,没有问题。求旋转矩阵的核心在于明确你的“已知条件”和“旋转目标”。根据不同的任务,求解的方法也不同。
下面我为你总结几种最常见的任务以及对应的求解方法。
核心思想回顾
在开始之前,请记住最关键的一点:一个3x3的旋转矩阵 R
的三列,分别代表了原始坐标系的 x, y, z 三个基向量 (1,0,0), (0,1,0), (0,0,1) 旋转之后的新方向。
[ | | | ]
R = [ x' y' z' ]
[ | | | ]
- 第一列
x'
:是原x轴旋转后的新方向向量。 - 第二列
y'
:是原y轴旋转后的新方向向量。 - 第三列
z'
:是原z轴旋转后的新方向向量。
理解这一点,是求解所有旋转矩阵问题的基础。
任务一:绕某个标准坐标轴旋转一个角度
这是最基础的旋转。
- 已知条件:旋转轴(X, Y, 或 Z轴)和旋转角度
θ
。 - 求解方法:直接使用标准公式。
绕 X 轴旋转 (Rx):
[ 1 0 0 ] R = [ 0 cos(θ) -sin(θ) ] [ 0 sin(θ) cos(θ) ]
绕 Y 轴旋转 (Ry):
[ cos(θ) 0 sin(θ) ] R = [ 0 1 0 ] [ -sin(θ) 0 cos(θ) ]
(注意:这里的符号
sin(θ)
和-sin(θ)
与其他两个矩阵不同,这是一个常见易错点)绕 Z 轴旋转 (Rz):
[ cos(θ) -sin(θ) 0 ] R = [ sin(θ) cos(θ) 0 ] [ 0 0 1 ]
任务二:进行连续的多次旋转(例如欧拉角)
真实世界的旋转通常是组合的,比如先绕Z轴旋转(偏航角 Yaw),再绕Y轴旋转(俯仰角 Pitch),最后绕X轴旋转(翻滚角 Roll)。
- 已知条件:一系列的旋转轴和对应的角度。
- 求解方法:将每一次旋转的矩阵依次相乘。
关键点:矩阵乘法的顺序至关重要!
旋转顺序决定了乘法顺序。通常有两种约定:
- 固定轴(Extrinsic)旋转:每次旋转都绕着世界坐标系的轴进行。矩阵从右向左写。
- 例如:先绕世界X轴转α,再绕世界Y轴转β。最终的旋转矩阵
R = Ry(β) * Rx(α)
。向量v
会先被Rx(α)
作用。
- 例如:先绕世界X轴转α,再绕世界Y轴转β。最终的旋转矩阵
- 自身轴(Intrinsic)旋转:第一次旋转绕世界轴,后续旋转都绕着物体自身已经旋转过的新坐标轴进行。矩阵从左向右写。
- 例如:先绕自身Z轴转α,再绕新的Y轴转β。最终的旋转矩阵
R = Rz(α) * Ry(β)
。
- 例如:先绕自身Z轴转α,再绕新的Y轴转β。最终的旋转矩阵
最常见的航空航天顺序 Yaw-Pitch-Roll (Z-Y-X),通常指先绕Z轴,再绕新的Y轴,再绕最新的X轴,其合成矩阵为 R = Rz(yaw) * Ry(pitch) * Rx(roll)
。
任务三:已知旋转后的坐标系长什么样
这是最直观也最强大的方法,直接回归到旋转矩阵的定义。
已知条件:旋转之后,新的坐标系的三个轴
x_new
,y_new
,z_new
在原始坐标系中的方向向量。求解方法:直接将这三个(单位)向量作为列向量,组成旋转矩阵。
R = [ x_new | y_new | z_new ]
[ x_new.x y_new.x z_new.x ] R = [ x_new.y y_new.y z_new.y ] [ x_new.z y_new.z z_new.z ]
前提:这三个向量
x_new
,y_new
,z_new
必须是单位向量,并且两两正交(相互垂直),构成一个右手坐标系。
实际例子:“Look-At” (看向) 矩阵 假设一个物体在原点,我们希望它“看向”目标点 target
,并且通常规定它的“头顶”朝向世界坐标系的上方 up
(通常是 (0,1,0))。
- 计算新的Z轴:通常,物体的-Z轴是“朝前”的方向。所以,新的Z轴方向是从目标指向物体。
z_new = normalize(position - target)
(或者normalize(target - position)
如果+Z是朝前) - 计算新的X轴:新的X轴(“右方”)必须同时垂直于“前方”和“上方”。
x_new = normalize(cross(up, z_new))
(cross
是叉乘) - 计算新的Y轴:新的Y轴(“上方”)必须同时垂直于新的Z轴和新的X轴。
y_new = cross(z_new, x_new)
- 组合矩阵:将
x_new
,y_new
,z_new
作为列向量填入矩阵即可。
任务四:绕任意轴旋转一个角度
这是一个更通用的情况,不局限于标准X,Y,Z轴。
- 已知条件:一个任意的旋转轴(单位向量)
u = (ux, uy, uz)
和旋转角度θ
。 - 求解方法:使用 罗德里格旋转公式 (Rodrigues' Rotation Formula)。
虽然公式看起来复杂,但计算机实现起来很直接: R = I + sin(θ)K + (1 - cos(θ))K²
其中:
I
是3x3的单位矩阵。K
是由旋转轴u
构成的反对称矩阵:[ 0 -uz uy ] K = [ uz 0 -ux ] [ -uy ux 0 ]
K²
是矩阵K
的平方。
总结表格
任务场景 | 已知条件 | 求解方法 |
---|---|---|
1. 绕标准轴旋转 | 旋转轴 (X, Y, Z) 和角度 θ | 直接套用 Rx, Ry, Rz 的标准公式。 |
2. 组合旋转 (欧拉角) | 一系列的旋转轴和角度 | 将每个旋转的标准矩阵按正确顺序相乘。注意顺序! |
3. 已知最终姿态 | 旋转后新坐标系的三个基向量 x' , y' , z' | 将 x' , y' , z' 作为列向量直接拼成矩阵 `R = [x' |
4. 绕任意轴旋转 | 任意旋转轴向量 u 和角度 θ | 使用 罗德里格旋转公式。 |
根据你的具体任务,选择对应的方法,就可以高效地求出所需的旋转矩阵。对于初学者,方法三 是最能帮你理解旋转矩阵本质的方法。