我们使用Euler角主要是因为他简单:使用3个数字就可以表示一个3D空间的方向。但是他有很多问题:
1。一个3D空间的Orientation具有3个自由度只使用3个数字来表示会产生aliasing 的现象。其中一个就是Gimble Lock
2。我们必须制定一个规则来定义
- 旋转复合顺序
- 哪个方向为正向旋转角度
- 参考哪一个旋转轴
3。一个Orientation不能通过唯一的一个Euler角组来定义:多个不同的组合会定义同一个方向
4。Interpolation十分困难
-----------------------------------------------------------------------------------------------------------------
所以我们使用一个固定的复合顺序(HPB):Heading * Pitch * Bank *Vertex_In_Object_Space
来将一个模型空间的顶点转换到世界空间
Heading 描述了一个相对于垂直方向的旋转
Pitch 描述了一个在Horizon上面的旋转
Bank 也叫做Twist是绕之物体自身的轴旋转
我们使用右手系所以使用Right Hand Rule来定义哪个方向的旋转为正旋转(CCW)
所有的旋转参考轴都是Object's Axis而不是世界坐标的轴
所有的角度都在确定的范围
- Heading [ -PI, +PI ]
- Pitch [ -PI/2, +PI/2 ]
- Bank [ -PI, +PI ]
而Gimble Lock 则是当第二个旋转为 +/-PI 的时候发生的。 在这时候第一个旋转轴同第三个旋转轴重合。
这时候对第三旋转轴的任何旋转都变为对第一个垂直轴的旋转。
出现的问题:
例如我们使用照相机来观察一个飞机。如果飞机的方向是我们的照相机产生了Gimble Lock。那么随后飞机相对于第三个轴上角度的变化将无法跟随。
参见:3D Math Primer for Graphic and Game Development
http://blog.csdn.net/kesalin/archive/2008/03/09/2161254.aspx