第八章
本章讨论的是三维旋转,其重点是如何描述三维旋转,用了几种表示方法并进行比较。前篇文章里我们分析过了描述一个旋转需要一个轴和一个角度,这包含了四个数据,如果我们假定轴从原点出发,那么我们只需要三个数据。
旋转矩阵
前文已经得到了旋转矩阵,需要注意的是方向余弦矩阵,其与旋转矩阵等价,这个说法其实更数学,
a
i
j
aij
aij的值等于i,j坐标轴方向向量的点积。
优点: 1:可以直接使用
2:和图形API接口契合
3:方便运算(嵌套组合求逆)
缺点: 1:人类难以直接使用
2:使用了9个数据,有6度冗余,带来空间,格式等问题(如矩阵蠕变)
欧拉角
用三个正交的轴方向的旋转角度表示旋转。
优点: 1:人类理解容易
缺点: 1:万向节死锁
2:插值麻烦
轴+角 指数映射
前文已经提到,我们呢可以用一个单位向量 n n n表示轴,一个 θ θ θ,表示角度,由于 n n n是单位向量,所以实际上它长度固定,用三个数据表示是冗余的,但是我们通过不能省去某个坐标,毕竟根据长度得到的需要判断正负,当然你可以选择某种方式去约定,当时这里有个更简单的方法: θ n θn θn,因为n长度为1,我们可以分离出 θ θ θ,这也就是指数映射,当然如果你学过李代数,你会有更深的理解。
四元数
四元数,也就是用
(
w
,
x
,
y
,
z
)
(w,x,y,z)
(w,x,y,z)来表示旋转,它当然也存储了轴
n
n
n和角度
θ
θ
θ,不过存储的方式比较独特:
(
w
,
v
)
=
(
w
,
x
,
y
,
z
)
=
(
c
o
s
(
θ
/
2
)
,
s
i
n
(
θ
/
2
)
n
)
=
(
(
c
o
s
(
θ
/
2
)
,
s
i
n
(
θ
/
2
)
n
x
,
s
i
n
(
θ
/
2
)
n
y
,
s
i
n
(
θ
/
2
)
n
z
)
(w,v)=(w,x,y,z)=(cos(θ/2),sin(θ/2)n)=((cos(θ/2),sin(θ/2)n_x,sin(θ/2)n_y,sin(θ/2)n_z)
(w,v)=(w,x,y,z)=(cos(θ/2),sin(θ/2)n)=((cos(θ/2),sin(θ/2)nx,sin(θ/2)ny,sin(θ/2)nz)
四元数数学基础
- 四元数求负:每个分量变负
- 单位四元数 ( 1 , 0 , 0 , 0 ) (1,0,0,0) (1,0,0,0)和 ( − 1 , 0 , 0 , 0 ) (-1,0,0,0) (−1,0,0,0)(严格意义上不是),表无位移,虽然变换意义上相同,数学上不同
- 四元数大小:只说旋转的话——1(重要性质)
- 共轭和逆:只考虑旋转的话,由3可得 q ∗ = q − 1 q^*=q^{-1} q∗=q−1
- 四元数乘法:哈密尔顿积: q 1 q 2 = [ w 1 , v 1 ] [ w 2 , v 2 ] = [ w 1 w 2 − v 1 ⋅ v 2 , w 1 v 2 + w 2 v 1 + v 1 ∗ v 2 ] q_1q_2=[w_1,v_1][w_2,v_2]=[w_1w_2-v_1·v_2,w_1v_2+w_2v_1+v_1*v_2] q1q2=[w1,v1][w2,v2]=[w1w2−v1⋅v2,w1v2+w2v1+v1∗v2]
- 乘法性质:和矩阵一毛一样,可结合不可交换,大小等于各自大小乘积,求导数顺序反过来的,都挺好推的
- 表示旋转:线代既视感:用 q q q四元数旋转向量 p p p: p ‘ = q p q − 1 p^`=qpq^{-1} p‘=qpq−1,多个旋转类比矩阵易得
- 四元数的差:其实更像商, d a = b da=b da=b,故 d = b a − 1 d=ba^{-1} d=ba−1
- 四元数点积:同向量点积
- 四元数对数和指数: l o g [ c o s ( θ / 2 ) , s i n ( θ / 2 ) n ] = [ 0 , θ n ] log[cos(θ/2),sin(θ/2)n]=[0,θn] log[cos(θ/2),sin(θ/2)n]=[0,θn] e x p ( [ 0 , θ n ] ) = [ c o s ( θ / 2 ) , s i n ( θ / 2 ) n ] exp([0,θn])=[cos(θ/2),sin(θ/2)n] exp([0,θn])=[cos(θ/2),sin(θ/2)n]该定义的意义看定义就能直观理解一部分,但是另一部分是和插值有关的,看了11就能明白
- t : 0 − > 1 , q t : [ 1 , 0 ] − > q t:0->1,q^t:[1,0]->q t:0−>1,qt:[1,0]−>q,因为有 q t q^t qt插值,而 q t = e x p ( t l o g q ) q^t=exp(tlogq) qt=exp(tlogq)
- Slerp公式:旋转四元数都是单位长度,因而实际分布在四维超空间的超球面上,可以做球面线性插值。这里推荐大家自行推导下(之前的也都可以推,但是数学基础好的应该秒出就没说)图片挡答案大法
借用下书上的插图,书上这里做了vt的平行线,我推导的时候直接基向量分解了,能得到一个等价的结果,具体是书上的 s i n ( 1 − t ) w sin(1-t)w sin(1−t)w用三角函数公式拆开来
四元数和复数
对于复数
a
+
b
i
a+bi
a+bi,我们可以用一个矩阵表示它,即:
a
+
b
i
=
[
a
b
−
b
a
]
(列向量版本,书上为行向量版本)
a+bi= \left[ \begin {matrix} a & b \\ -b & a \\ \end{matrix} \right] \tag{列向量版本,书上为行向量版本}
a+bi=[a−bba](列向量版本,书上为行向量版本)
那我们考察对于一个单位复数
c
o
s
θ
+
i
s
i
n
θ
cosθ+isinθ
cosθ+isinθ,我们惊讶的发现它的矩阵居然是二维旋转矩阵那三维呢?哈密尔顿为我们拓展了复数域,我们需要三个虚数,一个实数(所以是四元数)具体感兴趣的可以看一下哈密尔顿方程
比较
欧拉角最易于人类理解,矩阵一般是标准结果和最终结果(如图形API),但是中间经常不使用它,四元数易于插值用的最多,轴角和指数映射由于直接存了角度,在需要获得角度的情况下使用