マヤのことは知らないので、その回転はこんな感じだと思います。左右に回転させると自然な感じになります。次に、オブジェクトを上下に180度回転させてから、もう一度左右に回転させても、自然な感じがします。
行列を使用して変換(回転、拡大縮小、平行移動など)を行うという概念に精通している場合、クォータニオンはまったく同じ概念ですが、回転のみが許可されるため、変換を次のように制限するために使用することをお勧めします。回転。実際には、マトリックスまたはクォータニオンのいずれかを使用して同じことを行うことができます。
オブジェクトの現在のクォータニオンの状態を記憶し、次の回転フレームが発生したときに、新しい回転に古いクォータニオンを(この順序で)乗算して、次のフレームのクォータニオンを取得する必要があります。これにより、オブジェクトの向きに関係なく、次のフレームの回転が視聴者の視点から適用されるようになります。これは、「ユーザーが上下にスクロールしているため、オブジェクトのX軸の回転を変更する」と言うだけの単純な回転とは対照的であり、これにより反転が発生します。
行列のように、アクションが実際に適用されるのとは逆の順序でクォータニオンを乗算する必要があることを忘れないでください。そのため、新しい操作に既存のクォータニオンを乗算すると言いました。
例で終わります。ユーザーが2つのアクションを実行するとします。
- フレーム1で、ユーザーはオブジェクトをX軸を中心に180度回転します(上下回転)。
- フレーム2で、ユーザーはオブジェクトをY軸を中心に90度回転します(左/右回転)。
オブジェクトにクォータニオンQがあるとします。フレームごとに、オブジェクトをデフォルトの座標にリセットし、クォータニオンQを適用して回転させます。これで、アイデンティティクォータニオンで初期化できますが、最初のクォータニオンはQ0と呼ばれているとしましょう。
- フレーム1で、「X軸を中心に180度回転する」クォータニオンである新しいクォータニオンR1を作成します(このようなクォータニオンを計算するための数学をいくつか見つけることができます)。新しい演算に既存のクォータニオンを事前に乗算します:Q1 = R1*Q0。
- フレーム2で、「Y軸を中心に90度回転する」クォータニオンである新しいクォータニオンR2を作成します。新しい演算に既存のクォータニオンを事前に乗算します:Q2 = R2*Q1。
フレーム1ではQ1を使用してオブジェクトを表示し、フレーム2ではQ2を使用します。後続のユーザーアクションをクォータニオンに適用し続けるだけで、ビューアの参照フレーム内で常に回転します。