05/11/2020
3D中的方位与角位移
前言:
史诗级难以理解,关于欧拉角的万向节死锁与四元数,可以选择性跳过本章内容。
方位
方位主要描述的是物体的朝向,然后,方向与方位并不完全一样,向量有方向但没有方位。例子:3D中一个向量是一个箭头,如果让它自转并不会影响它的方向,因为它的轴没有形状或者厚度。但是你把向量当成一架飞机,它自转的时候,是以一种机身与机背面翻转的状态前行着,这就是方位改变。
- 确定一个方位至少需要3个数字。
- 方位也需要使用参考物来描述自身的旋转量。旋转量也称角位移
旋转矩阵
- 方位可以用矩阵来描述,通过旋转来描述
- 用把向量从惯性坐标系转换到物体坐标系的变换矩阵
- 根据轴n旋转 θ \theta θ角的矩阵
用哪个矩阵
我们知道怎样用矩阵将点从一个坐标系变换到另一个坐标系。首先了解方位是用矩阵来描述的,而矩阵表示的是转换后的基向量。
- 通过描述一个坐标系到另一个坐标系的旋转来确定一个方位
- 旋转矩阵是正交的,只需要使用转置,就可求得逆变化。
矩阵的优缺点
优点
- 可以立即进行向量的旋转
- 被图形API所使用
- 多个角位移连接
- 矩阵的逆
缺点
- 矩阵占用了更多的内存,如动画序列中的关键帧,
- 难使用
- 矩阵可能是病态的
欧拉角
欧拉角将方位围绕三个互相垂直轴的旋转。欧拉角描述了一个旋转序列。
- heading-pitch-bank 基本思想是让物体开始于标准方位-- 就是物体坐标轴和惯性坐标轴对象
M 惯 性 → 物 体 = H P B M_{惯性\rightarrow物体} = HPB M惯性→物体=HPB
HPB分别绕y,x,z轴旋转。欧拉角旋转的是坐标轴,如果变换的是点的话,需要倒过来。
欧拉角的优点
- 易于使用,简单理解
- 角位移用来表示旋转角度
- 最简洁的表达方式
- 任意三个数都是合法的
欧拉角的缺点
- 表达式不唯一
- 两个角度间差值非常困难:
- 别名问题,由角度天生的周期性和旋转之间的不独立性导致
- 万向锁问题,当限制住了heading-pitching-bank的区间范围后,还有一种别名问题,就时先heading45度再pitch90度,这与pitch90度再bank45度等价,所以在限制欧拉角中,如果pitch为正负90度,则bank为0.
限制欧拉角
heading和bank在-180度到+180度之间,pitch在-90度到+90度之间。如果pitch等于正负90度,则bank为零。
插值
求插值意味着平滑的从A变换到B,这项技术应用于角色动画或摄像机自动控制等方面。
问题
- 角度问题可以用限制欧拉角
- 使用了限制欧拉角还有问题,加入heading等于-170度,另一个heading是170度,插值是340度而不是20度,所以对欧拉角做插值也需要限制,为了找到最短弧。
w r a p ( x ) = x − 360 [ ( x + 180 ) / 360 ] Δ θ = w r a p ( θ 1 − θ 2 ) θ 1 = θ 0 + t Δ θ wrap(x) = x - 360[(x+180)/360]\\ \Delta \theta = wrap(\theta _{1} - \theta _{2}) \\ \theta _{1} = \theta _{0} + t \Delta \theta wrap(x)=x−360[(x+180)/360]Δθ=wra