一、旋转表达方式
1、欧拉角
欧拉角的优势是轻量直观(3个浮点数)。
- 问题:插值困难:
欧拉角仅对于单轴旋转容易插值,但是任意方向旋转则不能轻易插值。
- 问题:万向节死锁:
如果一个物体是按xyz顺序旋转的并且初始方向就是已经绕y旋转了90度,就会出现万向节死锁。三轴中的两个轴完全对齐,旋转x和旋转z轴等效,丧失了一个自由度。
- 问题:旋转次序:
旋转先后次序和旋转方式对结果是有差别的。并且区分动态欧拉角和静态欧拉角。
2、矩阵
矩阵是最有效的旋转表达方式。独一无二地表示任何旋转且不受万向节死锁影响。
4x4矩阵更是可以用来表示仿射变换。
- 问题:不够直观。
- 问题:不容易插值。
- 问题:需要大量存储空间。(至少9个浮点数)
3、轴角
轴角的优点也是直观轻量直观。
- 问题:不能简单的进行插值。
- 问题:不能像四元数和矩阵那样直接变换矢量,需要先转换为四元数或者矩阵。
4、四元数
使用四元数优势很多。
- 能串接多个旋转。
- 能轻易地进行插值。
- 比较轻量只需四个浮点数。
*5、SQT变换
SQT变换即四元数结合缩放因子和平移矢量。(SQT = [ s q t ])
SQT是4x4仿射矩阵的替代形式,只需要10个浮点数存储,并且方便插值。
*6、对偶四元数
对偶四元数也可以完整表示旋转平移缩放。对偶四元数和四元数的区别是对偶四元数的4个分量不是实数而是对偶数。
*二、旋转和自由度
自由度是指物体有多少个相互的独立的可变状态。无约束的3D物体拥有三个平移自由度和三个旋转自由度。
自由度$N_{DOF} = N_{参数} - N_{约束}$
欧拉角:3参数
四元数:4参数 - 1约束
(约束:四元数限制为单位长度)
轴角:4参数 - 1约束
(约束:轴矢量限制为单位长度)
3x3矩阵:9参数 - 6约束
(约束:三个列向量和三个行向量都为单位长度)