加速度計と OpenGL の使用方法を示す GLGravity iPhone の例では、ジンバル ロックの問題が発生しています。オイラー角の代わりにクォータニオン回転を使用するコードはありますか? どんな助けでも大歓迎です、私は成功せずに長い間これに苦労しています...
1 に答える
自分で実装して使用する前に、物事の理論をよく理解しておくと役立ちます。以下は、回転にクォータニオンを使用することに関する 2 つの紹介記事です。両方とも、主にスムーズな回転補間と、蓄積された回転でのジンバル ロックの回避に関連しています。
Gamasutra - クォータニオンを使用したオブジェクトの回転
実際のコードに関する限り、自分で作成するのではなく、「業界の強み」を持つベクトル数学ライブラリを入手して使用することをお勧めします。私の提案は、Bullet Physics Middleware プロジェクトの LinearMath 部分を取得することです。Bullet physics とそれに含まれる線形数学ライブラリは、Sony のトップ エンジニアによって開発され、何年にもわたって活発に開発されてきました。これは、ライセンス (Zlib ライセンス) による制限を受けずに自由に利用でき、世界中のプロのゲーム開発者によって使用されています。lib はクロス プラットフォーム/アーキテクチャであり、iPhone から PS3 まであらゆるものでコンパイルできます。
lib は、たとえばsetEulerZYXを使用して、オイラー角または任意の軸を中心とした回転からクォータニオンを作成できるQuaternionクラスを提供します。クォータニオンを取得したら、それらに適用可能なすべての一般的な操作の組み込み関数があります。プラス、マイナス、マル、ノーマライズ、スラープなど。
最終クォータニオンを OpenGL レンダリングに実際に適用するために、Transformクラスを使用すると、クォータニオンからマトリックスを構築できます。変換クラスには、OpenGL に渡す互換性のあるマトリックスを直接提供する関数getOpenGLMatrixが含まれています。
ライブラリには、他の非常に便利な行列およびベクトル クラスと関数のホストも含まれています。
Google コードから最新の Bullet dist を取得するか、次を使用して subversion から直接コードの LinearMath 部分のみを取得します。svn checkout http://bullet.googlecode.com/svn/trunk/src/LinearMath