11.3、四元法

四元法是爱尔兰数学家William Rowan Hamilton先生命名的。Hamilton 的突破是在1843年10月16日,星期一,在都柏林。当他跟他的妻子沿着皇家运河纤道散步时,突然想到了四元法的概念。为了把这个概念留给后人,在路过布鲁穆桥时,他把四元法的公式刻在了桥上。这个雕刻作为一个历史地标一直保留至今。

GLKit包含了GLKQuaternion数据类型和用来操作四元法的函数。每个四元数由一个矢量v和一个标量值s组成,这个s指定了绕着v的旋转量。3D图形应用需要使用四元法,因为当使用四元法时,可以实现绕着坐标轴的任意组合做任何旋转,而且可以避免可怕的“万向节锁”。例如,函数GLKMatrix4MakeLookAt()的实现所使用的数学计算无法产生一个直接沿着“上”矢量看的有效视点。这个限制的存在是因为当直接看向“上”或者“下”时,GLKMatrix4MakeLookAt()函数中的数学计算会试图计算90 度的正切,而这在数学上是未定义的。这个“未定义”的现象也会在真实世界中发生,就是当机械万向节碰到“万向节锁”和捕捉或者产生 了摇摆不稳定的行为时。维基百科上有一个可视化万向节锁的动画,地址为: http://en.wikipedia.org/wiki/Gimbal_lock。

四元数和矩阵之间的转换是双向的。函数GLKMatrix4 GLKMatrix4MakeWithQu-aternion(GLKQuaternion quaternion) 会返回一个矩阵,这个矩阵所包含的旋转跟参数quaternion所包含的旋转是相同的。GLKQuaternion GLKQuaternionMake WithMatrix4(GLKMatrix4 matrix)函数会返回一个四元数,这个四元数编码了matrix参数所包含的所有旋转。这个来回转换的能力提供了灵活性。本书中没有例子使用过四元数,不过当你熟悉了本书中的其他概念后,可以把OpenGLES_Ch6_1 和OpenGLES_Ch7_1 中的碰碰车例子转换成使用四元数的有趣的高级工程。很多情况下使用四元法可以简化你的代码。例如,在多个第三方3D游戏框架中使用了基于四元法的摄像机类。

网址: http://www.cprogramming.com/tutorial/3d/quaternions.html 中有一个关于四元法的简明教程。GLKit的GLKQuaternion.h文件揭示了苹果公司是怎么使用内联C代码的形式实现四元法的。虽然其中的数学计算超出了本书的讲解范围,但还算是比较简单的。四元法是使用4D空间来描述3D角度。如你所想,用文字讲解和描述四维是一个相当大的挑战。基于这个原因,更好地学习资源应该是四元数的在线演示和说明。

results matching ""

    No results matching ""