四元数
目录
1 复数与二维旋转 2
2 四元数 3
2.1 四元数的定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 四元数的二元表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 四元数的指数表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 四元数与三维旋转 5
3.1 绕任意轴的旋转 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 四元数的表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4 四元数与矩阵 7
5 参考资料 7
1
1 复数与二维旋转
复数有一个实部和一个虚部
𝑧 = 𝑎 + 𝑏𝑖
所有的复数构成一个二维线性空间, 称为复平面. 二维平面上的坐标可以与复数建立一一对应关系
(𝑥, 𝑦) 𝑧 = 𝑥 +𝑖𝑦
复数可以由欧拉公式表示
𝑧 = 𝑟 (cos 𝜃 + 𝑖 sin 𝜃) = 𝑟𝑒
𝑖 𝜃
进行泰勒展开即可完成证明. 由这个公式可以得到复数的乘法在几何上的意义
𝑧
1
𝑧
2
= 𝑟
1
𝑟
2
(cos(𝜃
1
+ 𝜃
2
) +𝑖 sin(𝜃
1
+ 𝜃
2
))
如果相乘的复数是一个单位复数, 这个乘法实际上就是进行了一个旋转变换. 实际上, 二维的旋转变换矩
阵与单位复数一一对应
𝑅(𝜃) =
cos 𝜃 sin 𝜃
sin 𝜃 cos 𝜃
!
𝑒
𝑖 𝜃
= cos 𝜃 + 𝑖 sin 𝜃
具体而言, 对应关系可以表示为
1
1 0
0 1
!
, 𝑖
0 1
1 0
!
显然它们是线性无关的, 也满足复数的乘法规则
𝑖
2
= 1
0 1
1 0
!
2
=
1 0
0 1
!
能否把坐标也写成这种形式呢? 考虑一个二维平面上的坐标 (𝑥, 𝑦), 可以写成
(𝑥, 𝑦) 𝑥 +𝑖𝑦
𝑥 𝑦
𝑦 𝑥
!
将其乘上一个二维旋转矩阵, 我们期望它应当得到旋转后的坐标
cos 𝜃 sin 𝜃
sin 𝜃 cos 𝜃
!
𝑥 𝑦
𝑦 𝑥
!
=
𝑥 cos 𝜃 𝑦 sin 𝜃 𝑥 sin 𝜃 𝑦 cos 𝜃
𝑥 sin 𝜃 + 𝑦 cos 𝜃 𝑥 cos 𝜃 𝑦 sin 𝜃
!
得到的矩阵正是旋转后的坐标对应的矩阵
𝑧
= 𝑥 cos 𝜃 𝑦 sin 𝜃 +𝑖(𝑥 sin 𝜃 + 𝑦 cos 𝜃)
实际上这个矩阵乘法是可交换的
𝑥 𝑦
𝑦 𝑥
!
cos 𝜃 sin 𝜃
sin 𝜃 cos 𝜃
!
=
𝑥 cos 𝜃 𝑦 sin 𝜃 𝑥 sin 𝜃 𝑦 cos 𝜃
𝑥 sin 𝜃 + 𝑦 cos 𝜃 𝑥 cos 𝜃 𝑦 sin 𝜃
!
这也就对应了复数的乘法交换律
2 四元数
2.1 四元数的定义
四元数 (quternion) 与复数类似, 区别在于它有三个虚单位
𝑞 = 𝑎 + 𝑏𝑖 + 𝑐 𝑗 + 𝑑𝑘
三个虚单位是线性无关的, 它们各自的平方为 1
𝑖
2
= 𝑗
2
= 𝑘
2
= 1
此外还定义了虚单位之间的乘法规则
𝑖 𝑗 𝑘 = 1
定义四元数的乘法是反交换,
𝑖 𝑗 = 𝑗𝑖, 𝑗 𝑘 = 𝑘 𝑗, 𝑘𝑖 = 𝑖𝑘
综合而言可以得到四元数的定义
𝑖
2
= 𝑗
2
= 𝑘
2
= 𝑖 𝑗 𝑘 = 1
𝑖 𝑗 = 𝑗𝑖, 𝑗 𝑘 = 𝑘 𝑗, 𝑘𝑖 = 𝑖𝑘
与复数类似, 四元数的模长定义为
|𝑞| =
𝑎
2
+ 𝑏
2
+ 𝑐
2
+ 𝑑
2
四元数的共轭定义为
𝑞
= 𝑎 𝑏𝑖 𝑐 𝑗 𝑑𝑘
显然
𝑞
𝑞 = |𝑞|
2
因而可以得到四元数的逆
𝑞
1
=
1
|𝑞|
2
(𝑎 𝑏𝑖 𝑐 𝑗 𝑑𝑘)
2.2 四元数的二元表示
注意到四元数的虚部遵循类似与三维空间基矢的外积规则
𝑖 𝑗 = 𝑗𝑖 = 𝑘, 𝑗 𝑘 = 𝑘 𝑗 = 𝑖, 𝑘𝑖 = 𝑖𝑘 = 𝑗
i ×j = j × i = k, j × k = k × j = i, k × i = i × k = j
因而不妨将四元数的虚部写为一个三维矢量, 由此得到四元数的二元表示
𝑞 = 𝑠 + 𝑣
其中
𝑣 =
©
«
𝑥
𝑦
𝑧
ª
®
®
®
¬
𝑥𝑖 + 𝑦 𝑗 + 𝑧𝑘
在该表示下, 四元数的乘法可以写为
𝑞
1
𝑞
2
= (𝑠
1
𝑠
2
v
1
· v
2
) + 𝑠
1
v
2
+ 𝑠
2
v
1
+ v
1
× v
2
这是容易验证的. 不妨设 𝑞
1
= 𝑠
1
+ 𝑣
1
, 𝑞
2
= 𝑠
2
+ 𝑣
2
, 那么
𝑞
1
𝑞
2
= (𝑠
1
+ 𝑥
1
𝑖 + 𝑦
1
𝑗 + 𝑧
1
𝑘)(𝑠
2
+ 𝑥
2
𝑖 + 𝑦
2
𝑗 + 𝑧
2
𝑘)
= 𝑠
1
𝑠
2
+
1
(𝑥
2
𝑖 + 𝑦
2
𝑗 + 𝑧
2
𝑘) + (𝑥
1
𝑖 + 𝑦
1
𝑗 + 𝑧
1
𝑘)𝑠
2
+ (𝑥
1
𝑖 + 𝑦
1
𝑗 + 𝑧
1
𝑘)(𝑥
2
𝑖 + 𝑦
2
𝑗 + 𝑧
2
𝑘)
对比, 只需要验证
(𝑥
1
𝑖 + 𝑦
1
𝑗 + 𝑧
1
𝑘)(𝑥
2
𝑖 + 𝑦
2
𝑗 + 𝑧
2
𝑘) = v
1
· v
2
+ v
1
× v
2
将左边展开
(𝑥
1
𝑖 + 𝑦
1
𝑗 + 𝑧
1
𝑘)(𝑥
2
𝑖 + 𝑦
2
𝑗 + 𝑧
2
𝑘) = 𝑥
1
𝑥
2
𝑦
1
𝑦
2
𝑧
1
𝑧
2
+ 𝑥
1
𝑦
2
𝑖 𝑗 + 𝑥
1
𝑧
2
𝑖𝑘 + 𝑦
1
𝑥
2
𝑗𝑖 + 𝑦
1
𝑧
2
𝑗 𝑘 + 𝑧
1
𝑥
2
𝑘𝑖 + 𝑧
1
𝑦
2
𝑘 𝑗
前半部分正是 v
1
· v
2
. 对于后半部分, 利用 𝑖 𝑗 𝑘 = 1 和虚部的外积规则, 可以得到
𝑥
1
𝑦
2
𝑖 𝑗 + 𝑥
1
𝑧
2
𝑖𝑘 + 𝑦
1
𝑥
2
𝑗𝑖 + 𝑦
1
𝑧
2
𝑗 𝑘 + 𝑧
1
𝑥
2
𝑘𝑖 + 𝑧
1
𝑦
2
𝑘 𝑗
= 𝑥
1
𝑦
2
𝑘 𝑥
1
𝑧
2
𝑗 𝑦
1
𝑥
2
𝑘 + 𝑦
1
𝑧
2
𝑖 + 𝑧
1
𝑥
2
𝑗 𝑧
1
𝑦
2
𝑖
= (𝑦
1
𝑧
2
𝑧
1
𝑦
2
)𝑖 + (𝑧
1
𝑥
2
𝑥
1
𝑧
2
)𝑗 + (𝑥
1
𝑦
2
𝑦
1
𝑥
2
)𝑘
不难发现这正是 v
1
× v
2
2.3 四元数的指数表示
希望类似复数一样将四元数写为矩阵形式, 利用四元数的二元表示, 结合指数函数的泰勒展开
𝑒
𝑥
= 1 +𝑥 +
𝑥
2
2!
+
𝑥
3
3!
+ ···
那么
𝑒
𝑞
= 𝑒
𝑠+v
= 𝑒
𝑠
1 +v +
v
2
2!
+
v
3
3!
+ ···
此处
v = 𝑥𝑖 + 𝑦 𝑗 + 𝑧𝑘
稍加计算
v
2
= 𝑥
2
𝑦
2
𝑧
2
= |v|
2
v
3
= v|v|
2
v
4
= |v|
4
···
因而
𝑒
𝑞
= 𝑒
𝑠
1 +v
|v|
2
2!
v|v|
2
3!
+ ···
将奇数次幂与偶数次幂分开
𝑒
𝑞
= 𝑒
𝑠
1
|v|
2
2!
+
|v|
4
4!
···
+
v
|𝑣|
|𝑣|
|v|
3
3!
+
|v|
5
5!
···
注意到括号中正是 cos sin 的泰勒展开, 因而可以写为
𝑒
𝑞
= 𝑒
𝑠
cos |v| +
v
|v|
sin |v|
因而对于一个四元数 𝑞 = 𝑠 + v, 可以写为
𝑞 =
|
𝑞
|
𝑠
|
𝑞
|
+
v
|
𝑣
|
|
𝑣
|
|
𝑞
|
注意到
𝑠
2
+
|
𝑣
|
2
=
|
𝑞
|
2
因而可以找到一个角度 𝜃 使得
sin 𝜃 =
|
𝑣
|
|
𝑞
|
, cos 𝜃 =
𝑠
|
𝑞
|
希望
𝑒
𝑠
+𝑣
= 𝑒
𝑠
cos |𝑣
| +
𝑣
|𝑣
|
sin |𝑣
|
=
|
𝑞
|
𝑠
|
𝑞
|
+
v
|
𝑣
|
|
𝑣
|
|
𝑞
|
对比得到
𝑒
𝑠
=
|
𝑞
|
, cos |𝑣
| =
𝑠
|
𝑞
|
,
𝑣
|𝑣
|
sin |𝑣
| =
v
|
𝑣
|
|
𝑣
|
|
𝑞
|
此时不妨就令 𝑠
= 0,
|
𝑞
|
看作一个整体的系数提出, 那么得到
v
= arccos
𝑠
|
𝑞
|
,
v
|v
|
=
v
|v|
得到 𝑞 的指数表示
𝑞 =
|
𝑞
|
exp
v
|v|
arccos
𝑠
|
𝑞
|
3 四元数与三维旋转
3.1 绕任意轴的旋转
三维空间中的旋转总能找到一个旋转轴, 不妨设为 P , 它是一个单位向量. 不妨再假定被旋转的向量为 A,
那么可以将 A 分为 P 方向和 P 垂直方向的两部分
A = A
+ A
其中
A
= (A · P )P
A
= A (A · P )P
P 平行的部分不会发生变化, 因而只需要考虑 A
的旋转. 为了确定旋转所在的平面, 还需要找到另一
个与 P 垂直的向量, 注意到向量的外积与两个向量垂直
Q = A ×P
另外, 如果注意力足够集中, 不难发现
|A
| = |A| sin 𝜃 = |A × P | = |Q|
这两个向量构成了一个理想的基! 因而可以直接进行线性组合得到旋转后的向量
A
= cos 𝜃A
+ sin 𝜃Q
全部代入后即可得到旋转后的向量
A
= (A · P )P +cos 𝜃
[
A (A · P )P
]
+ sin 𝜃
(
A × P
)
也就是
A
= cos 𝜃A + sin 𝜃A × P + (1 cos 𝜃)(A · P )P
3.2 四元数的表示
注意到四元数的乘法规则
(𝑠
1
+ v
1
)(𝑠
2
+ v
2
) = (𝑠
1
𝑠
2
v
1
· v
2
) + 𝑠
1
v
2
+ 𝑠
2
v
1
+ v
1
× v
2
考虑到四元数三个虚部的特殊性, 令三个虚部代替三维空间中的三个基矢, 那么三维坐标就可以对应
(𝑥, 𝑦, 𝑧) 𝑥𝑖 + 𝑦 𝑗 + 𝑧𝑘
这样令乘法规则里的 𝑠
1
= 0, 就可以得到
A(𝑠 + v) = A · v + A × v + 𝑠A
v
1
就是待旋转的向量.P ·v 是实数, 而旋转后的四元数应当也表示坐标, 因而是一个纯虚数, 这并不对.
意到
(𝑠 v)A(𝑠 + v) = (𝑠
2
v
2
)A + 2𝑠A × v + 2(A · v)v
旋转不应改变向量的模长, 因而 𝑠 + v 应当是单位四元数,
𝑠
2
+
|
v
|
2
= 1
重新写出旋转后的向量
A
= cos 𝜃A + sin 𝜃A × P + (1 cos 𝜃)(A · P )P
注意到 P 为单位向量, 而此处的 v 显然不是单位的. 由对应关系可以列出方程
𝑠
2
|
v
|
2
= cos 𝜃
2𝑠v = sin 𝜃
2v
2
= 1 cos 𝜃
𝑠
2
+
|
v
|
2
= 1
显然
𝑠 = cos
𝜃
2
, v = sin
𝜃
2
P
因而得到了用于旋转的四元数
𝑞 = cos
𝜃
2
+ sin
𝜃
2
P
其中 P 是旋转轴的单位向量,𝜃 是旋转角度
4 四元数与矩阵
四元数可以与矩阵对应
1
1 0
0 1
!
, 𝑖
0 1
1 0
!
, 𝑗
0 𝑖
𝑖 0
!
, 𝑘
𝑖 0
0 𝑖
!
很容易验证这些矩阵满足四元数的乘法规则, 并且它们是线性无关的. 因而任意一个四元数都可以唯一对
应一个二阶复矩阵
𝑞 = 𝑠 + 𝑥 + 𝑦𝑖 + 𝑧 𝑗
𝑠 + 𝑧𝑖 𝑥 + 𝑦𝑖
𝑥 + 𝑦𝑖 𝑠 𝑧𝑖
!
该矩阵的行列式为
𝑠 + 𝑧𝑖 𝑥 + 𝑦𝑖
𝑥 + 𝑦𝑖 𝑠 𝑧𝑖
= 𝑠
2
+ 𝑥
2
+ 𝑦
2
+ 𝑧
2
这正是四元数的模长平方, 它的逆也对应了四元数的逆
𝑠 + 𝑧𝑖 𝑥 + 𝑦𝑖
𝑥 + 𝑦𝑖 𝑠 𝑧𝑖
!
1
=
1
𝑠
2
+ 𝑥
2
+ 𝑦
2
+ 𝑧
2
𝑠 𝑧𝑖 𝑥 𝑦𝑖
𝑥 𝑦𝑖 𝑠 + 𝑧𝑖
!
5 参考资料
1. 四元数 Quaternion 的基本运算-https://www.cnblogs.com/dechinphy/p/quaternion-calc.html
2. Gimbal Lock
欧拉角死锁问题
-https://www.cnblogs.com/dechinphy/p/quaternion.html
3. 四元数和旋转 (Quaternion & rotation)-https://www.zhihu.com/tardis/zm/art/78987582