废话不多说,直接上链接:https://eater.net/quaternions
这是一个可视化的四元数模型以及讲解,非常直观,不过还需稍加理解
推荐一个B站博主:3Blue1Brown(知道他的人都说好)
1.四元数需要解决的问题
首先我们需要知道四元数适用于计算机视觉、虚拟现实、量子物理等方面,因为四元数能够很方便地描述三维向量以及空间旋转,而且不存在问题。
那么其他方法会存在什么问题呢?
- 旋转矩阵:使用9个量来描述3个自由度的旋转,具有冗余性。
- 欧拉角和旋转向量:虽然紧凑,但存在奇异性,即万向锁问题。
2.四元数的旋转
四元数(Quaternion),是Hamilton找到的一种扩展复数,它既是紧凑的,也没有奇异性。
一个四元数 q拥有一个实部和三个虚部组成,即:
q
=
q
0
+
q
1
i
+
q
2
j
+
q
3
k
q=q_0+q_1i+q_2j+q_3k
q=q0+q1i+q2j+q3k
同时也可以使用一个标量S和一个向量V进行表示,即:
q
=
[
S
,
V
]
q=[ S ,V ]
q=[S,V]
考虑到三维空间需要三个轴,所以我们采用四元数的三个虚部老表示空间中的一个点,然后通过实部与虚部的变化实现三维空间的旋转。
我们知道一个模长为一的复数可以表示复平面上的纯旋转(没有长度缩放),那么同理我们也可以使用单位四元数来表示三维空间中的任意一个旋转,但这种表达方式有着微妙的不同。首先我们得知道该四元数的形式,如下:
q = c o s ( θ / 2 ) + s i n ( θ / 2 ) ( q 1 i + q 2 j + q 3 k ) q=cos(\theta/2)+sin(\theta/2)(q_1i+q_2j+q_3k) q=cos(θ/2)+sin(θ/2)(q1i+q2j+q3k)
那么为什么我们使用的不是 θ \theta θ 而是 θ / 2 \theta/2 θ/2,这就要从四元数在三维空间的旋转中进行解释了,因为我们通常使用一个旋转公式来表达三维点的旋转,所以先假设一个虚四元数的三维空间点 P 经过旋转之后变为 p’ (相当于把四元数的三个虚部和空间中的三个方向轴想对应),然后使用四元数 q 表示旋转,即有:
p ′ = q p q − 1 p\ '=qpq^{-1} p ′=qpq−1
- 这里的推导过程稍难,请参考链接:https://blog.csdn.net/codingQueen_gogogo/article/details/80964067,虽然我还没怎么看懂,希望能够起到作用。
- 同样我们需要证明四元数旋转后的三维点实部为0,请参考链接https://blog.csdn.net/luohuiwu/article/details/80719002
所以我们可以看到,当三维点 p 进行旋转时,先后进行了 q 的旋转和 q’ 的旋转,所以就是先后旋转了 θ / 2 \theta/2 θ/2 的角度,合起来就是 θ \theta θ 的角度了。
3.四元数的简单运算
首先我们定义两个四元数 : q a = [ S a , V a ] q_a=[ Sa ,Va ] qa=[Sa,Va] 和 q b = [ S b , V b ] q_b=[ Sb ,Vb ] qb=[Sb,Vb]
- 加法和减法 : q a ± q b = [ S a ± S b , V a ± V b ] . q_a\pm q_b=[Sa \pm Sb \ ,\ Va\pm Vb] . qa±qb=[Sa±Sb , Va±Vb].
- 乘法(不可交换) : q a q b = [ S a S b − V a T V b , S a V b + S b V a + V a × V b ] . q_aq_b=[S_aS_b-Va^TVb\ ,\ S_aVb+S_bV_a+V_a\times V_b] . qaqb=[SaSb−VaTVb , SaVb+SbVa+Va×Vb].
- 共轭 : q a ∗ = S a − q 1 i − q 2 j − q 3 k = [ S a , − V a ] . q_a^*=S_a-q_1i-q_2j-q_3k=[S_a,-V_a]. qa∗=Sa−q1i−q2j−q3k=[Sa,−Va]. 四元数共轭与其本身相乘,会得到一个实四元数,其实部为模长的平方 q ∗ q = q q ∗ = [ S a 2 + V T , 0 ] . q^*q=qq^*=[S_a^2+V^T\ ,\ 0 ]. q∗q=qq∗=[Sa2+VT , 0].
- 模长 : ∥ q a ∥ = S a 2 + q 1 2 + q 2 2 + q 3 2 . \Vert q_a\Vert =\sqrt{S_a^2+q_1^2+q_2^2+q_3^2}. ∥qa∥=Sa2+q12+q22+q32.
- 逆 : q − 1 = q ∗ / ∥ q a ∥ 2 . q^{-1}=q^*/\Vert q_a\Vert ^2. q−1=q∗/∥qa∥2. 按此定义,四元数和自己的逆的乘积为实四元数1 q q − 1 = q − 1 q = 1. qq^{-1}=q^{-1}q=1. qq−1=q−1q=1.