什么是方位?
物体的“方位”主要描述的是物体的朝向,但是“方位”和“方向”不是同一个概念,例如,向量有方向没有方位,可以让向量自转,但是它却不会有任何变化,因为向量的属性没有“厚度”和“宽度”。但是一个3D的物体自转就会有方位的变化。弄清楚方位还需要区分这三个词:方位、角位移、旋转。角位移是方向上的变化(例如,从旧方位到新方位的角位移,或者从惯性坐标系到物体坐标系的角位移),“方位”是一个单一的状态,“角位移”是描述两个状态之间的差别。所以一般用矩阵和四元数来描述“角位移”,用欧拉角来描述“方位”。
欧拉角
欧拉角的基本思想是将角位移分解为绕三个互相垂直轴的三个旋转组成的序列。一般是使用笛卡尔坐标系并按照一定的顺序所组成的旋转序列,最常用的约定,是“heading-pitch-bank”约定。heading为绕y轴的旋转量,pitch为绕物体坐标系的x轴,bank为绕物体坐标系的z轴。
欧拉角的缺点:1、在将一个角度加上360度的倍数时,就会遇到别名问题。因为加上360度之后,物体的方位不会改变。2、更麻烦的别名问题是由三个角度不互相独立导致的。例如,pitch135度等价于heading180度,pitch45度。为了保证任意方位都只是独一无二的表示,必须限制角度的范围。一种常用的技术是将heading和bank限制在+180°到-180°之间,pitch限制在+90°到-90°之间。欧拉角最著名的别名问题是这样的:先heading45°再pitch90°,一旦选择±90°为pitch角,就被限制在只能绕竖直轴旋转,这种现象,角度为±90°的第二次旋转使得第一次和第三次旋转的旋转轴相同,称作“万向锁”。为了消除限制欧拉角的这种别名现象,规定万向锁情况下由heading完成绕竖直轴的全部旋转。换句话说,在限制欧拉角中,如果pitch为±90°,则bank为零。
矩阵形式
3D中,描述坐标系中方位的一种方法就是列出这个坐标系的基向量,这些基向量是用其它的坐标系来描述的,换句话说,能用一个旋转矩阵来描述这两个坐标系之间的相对方位,这个旋转矩阵用于把一个坐标系中的向量转换到另一个坐标系中。
四元数
一个四元数包含一个标量分量和一个3D向量分量。经常将标量分量记做w,记向量分量为单一的v或者分开的x,y,z。两种记法分别为[w,v]或者[w,x,y,z]。
数学中的复数可以和2D向量联系在一起,复数集存在于一个2D平面内上,可以认为这个平面有两个轴:实轴和虚轴。它能用来表达平面中的旋转,例如复数p绕原点旋转角度θ的情况,为进行这个旋转,引入另一个复数q=cosθ+i sinθ,则旋转后的向量就可以表示为
q'=pq=(x+y*i)(cosθ+i*sinθ)=(x*cosθ-y*sinθ)+i*(x*sinθ+y*cosθ)
引入复数q和使用2×2矩阵达到的效果是一样的。四元数扩展了复数系统,它使用三个虚部i,j,k,他们的关系如下:
i²=j²=k²=-1;
ij=k,ji=-k;
jk=i,kj=-i;
ki=j,ik=-j;
一个四元数[w,(x,y,z)]定义了复数w+xi+yj+zk。
四元数能被解释为角位移的轴-角对(n,θ)方式,然而n和θ不是直接存储在四元数的四个数中,具体的方式如下:
q=[cos(θ/2) sin(θ/2)n]
=[cos(θ/2) (sin(θ/2)nx sin(θ/2)ny sin(θ/2)nz)]
●四元数的共轭和逆
四元数的共轭记做q=[w v]=[w -v]
四元数的逆记做q﹣1=q/ |q|,定义为四元数的共轭除以它的模。
共轭非常有趣,q和q代表着相反的角位移。
●四元数叉乘
四元数有一个非常有用的性质。扩展一个标准3D点(x,y,z)到四元数空间,通过定义四元数p=[0,(x,y,z)]即可,设q为旋转四元数形式[cos(θ/2),nsin(θ/2)],n为旋转轴,单位向量,θ为旋转角,p´=qpq﹣¹,这个乘法可以使3D点p绕n旋转。同时,四元数乘法能用来连续多次旋转,先进行a旋转再进行b旋转等价于执行乘积ba代表的单一旋转。
●四元数的“差”
“差”被定义为一个方位到另一个方位的角位移,也就是给定方位a和b,能够计算从a旋转到b的角位移d。
ab=d;
d=a﹣¹b
●四元数插值-slerp slerp(q1,q2,t)=q1(q1﹣¹q2)^t。
具体到几何上,
下面讨论一下怎样将角位移从一种形式转换到另一种形式
从欧拉角转换到矩阵
欧拉角描述了一个旋转序列。分别计算出每个旋转的矩阵再将他们连接成一个矩阵,这个矩阵就代表了整个角位移。可以是物体到惯性的矩阵,也可以是惯性到物体的矩阵。
惯性-物体
M=HPB,H、P、B分别为heading、pitch、bank的旋转矩阵,
物体-惯性
等于HPB的逆,为B﹣¹P﹣¹H﹣¹。
从矩阵转换到欧拉角
将角位移从矩阵形式转换到欧拉角需要考虑以下几点:
1、必须清楚矩阵代表什么旋转,物体-惯性or惯性-物体。
2、对任意给定角位移,存在无穷多个欧拉角可以表示它。所以假设只用“限制欧拉角”。
利用上面的惯性到物体的矩阵可以解得欧拉角。
M=
从四元数转换到矩阵
从矩阵转换到四元数
直接利用四元数到矩阵的公式检查对角线上元素的关系得到w,x,y,z的值。
从欧拉角转换到四元数
为了将角位移从欧拉角形式转换到四元数,可以先将x,y,z三个旋转分别转化为四元数,再将这三个四元数连接成一个四元数。也要考虑到是物体-惯性还是惯性-物体。
q=hpb
从四元数转换到欧拉角
由于有些公式不好编辑,所以直接放上了资料截图。上面的公式都参考于《3D数学基础:图形与游戏开发》,放上链接http://pan.baidu.com/s/1mibKdtA

网友评论