四元数基础
以下内容摘自《3D数学基础:图形与游戏开发》(清华大学出版社)
四元数
1.四元数和轴-角对
绕轴n旋转θ角:n是一个向量,根据左手或右手法则定义旋转的正方向, θ角表示旋转的量。
那么表示这个旋转的四元数为:
2.单位四元数
几何上存在两个单位四元数,它们代表没有角位移:
任意四元数乘以一个几何单位四元数得到的角位移相同(虽然乘以两种形式得到q和-q的数形式不同,但是几何意义相同,可以认为结果相同)。
数学上实际只有一个单位四元数,即:
因为数学上q和-q不相等。
3.四元数的模
代入轴-角对的公式求模。
n为单位向量,最后可以得到四元数的模为1.称为单位四元数。
4.四元数的共轭和逆
四元数的共轭就是让四元数的向量部分取负,记作:
四元数和它的共轭代表相反的角位移,因为相当于旋转轴反向。
四元数的逆定义为四元数的共轭除以它的模:
一般使用单位四元数,此时它的逆和共轭其实是相等的。
5.四元数乘法(叉乘)
不用为四元数叉乘使用乘号,“行”“列”四元数也没有什么区别。
四元数叉乘满足结合律,但是不满足交换律。
四元数乘积的模等于模的乘积,这样保证了单位四元数相乘仍然是单位四元数。
四元数乘积的逆等于各个四元数的逆以相反的顺序相乘。
6.标准3D点的四元数旋转
扩展一个标准的3D点(x,y,z)到四元数空间,通过定义四元数:
即可。
设我们讨论的旋转四元数为:
则执行下面的乘法可以使3D点p绕n旋转:
多次旋转的情况:
注意这个旋转是以从右向左的顺序发生的。
可以改变标准的定义,以相反的运算顺序来定义四元数乘法,从而将形式变为与旋转发生的顺序一致,此处公式略去。
7.四元数“差”
利用四元数的乘法和逆,可以计算两个四元数的“差”,四元数“差”表示一个方位到另一个方位的角位移。
注意不能除以四元数,只能乘以它们的逆来达到目的。
8.四元数的点乘
点乘结果是标量,两个单位四元数点乘的结果区间为[-1,1]。
点乘结果的绝对值越大,相乘的两个四元数代表的角位移越相似。
9.四元数的对数、指数和标量乘运算
略。
10.四元数求幂
若四元数 代表一个角位移, 中取t等于1/3,就得到代表1/3这个角位移的四元数。
注意的是四元数表达角位移时使用最短圆弧,不能绕圈。
即如果q代表绕x轴顺时针旋转60°,那么t取4时不是预期的绕x轴顺时针旋转240°,而是逆时针80°。
所以凡是涉及到指数运算的代数公式,如 ,对四元数不再适用。
S=4,t=1/2,本来应该是等同于 ,然而由于t=4时选了最短弧,所以产生的不是预期的结果。
11.四元数插值——“Slerp”
球面线性插值(Spherical Linear Interpolation).
Slerp运算非常有用,因为它可以在两个四元数间平滑插值,避免了欧拉角插值的所有问题(角度限制以找到最短弧,万向锁(导致抖动、路径错误),根本问题是插值过程中角速度不是恒定的。)
两个标量间的插值一般是这样:
可以使用同样的步骤在四元数间插值:
(1).计算两个值的差。利用逆矩阵推到的。
(2).计算差的一部分。(四元数求幂)。
(3).在开始值上加上差的一部分。(方法使用四元数乘法来组合角位移)
这是理论上的Slerp计算过程。实践中将使用一种更加有效的方法。
所有单位四元数都存在于一个4D球面上。
几何推导略。结果:
可以用点乘来计算两个四元数之间的“角度”。
有两点需要考虑:
(1)四元数q和-q代表相同的方位,但它们作为slerp的参数时可能导致不一样的结果。解决方法是选择两个数的符号使得它们点乘的结果是非负。
(2)如果两个四元数非常接近,那么sin会非常小,这时候除法可能会出现问题,为了避免这样的问题,当sin非常小时使用简单的线性插值。
12.四元数样条——“squad”
Spherical and Quadrangle
木有看懂。
13.四元数的优缺点
优点:
平滑插值。
快速连接和角位移求逆。
能和矩阵形式快速转换。
仅用四个数。
缺点:
比欧拉角稍微大一些。
四元数可能不合法。坏的输入数据或浮点数舍入误差积累引起。(通过四元数标准化解决这个问题,确保四元数为单位大小。)
难于使用。
14.四元数、欧拉角、矩阵之间的转换
略。
参考资料:
《3D数学基础:图形与游戏开发》(清华大学出版社)