4

GLGravity iPhone 示例展示了如何使用加速度计和 OpenGL 遭受 Gimbal Lock 问题。我想知道是否有任何代码可以使用四元数旋转而不是欧拉角?任何帮助将不胜感激,我长期以来一直在努力解决这个问题,但没有成功......

4

1 回答 1

3

在尝试自己实施和使用它之前,对事物的理论有一个很好的掌握是有帮助的。下面是两篇关于使用四元数进行旋转的介绍性文章。两者都主要与平滑旋转插值和避免在累积旋转中的万向节锁定有关:

Gamedev.net - 四元数权力

Gamasutra - 使用四元数旋转对象

现在就实际代码而言,我建议获取并使用“行业实力”矢量数学库,而不是自己滚动。我的建议是抓住 Bullet Physics Middleware 项目的 LinearMath 部分。Bullet Physics 和随附的线性数学库由 Sony 的一些顶级工程师开发,并且多年来一直在积极开发中。它是免费提供的,不受任何许可(Zlib 许可)的限制,被全世界的专业游戏开发者使用。该库是跨平台/架构的,可以在从 iPhone 到 PS3 的任何东西上编译。

该库提供了一个Quaternion类,允许您从欧拉角或围绕任意轴的旋转创建四元数,例如使用setEulerZYX。一旦你有了四元数,就会有适用于它们的所有常见操作的内置函数;plus, minus, mul, normalize, slerp 等等。

为了将最终的四元数实际应用于 OpenGL 渲染,Transform类允许您从四元数构造矩阵。变换类又包含一个函数getOpenGLMatrix,它直接为您提供一个兼容的矩阵以传递给 OpenGL。

该库还包括许多其他非常有用的矩阵和向量类和函数。

从google code获取最新的 Bullet dist ,或者直接从 subversion 获取代码的 LinearMath 部分,使用:svn checkout http://bullet.googlecode.com/svn/trunk/src/LinearMath

于 2010-03-27T02:21:56.430 回答