トリッキー四元数





なぞなぞを推測:4つの次元に座って、複素数で向きを変えますか?



ヒント:これはスカラーベクトルです。 そして実際の行列。 そしてハミルトンはそれを思いついた。



助けなかった? まあ、あなた、それは小学校です! これは四元数です! クォータニオンは、ロボット工学、ゲームエンジン、シミュレーションソフトウェア、および一般的にオイラー角または行列の問題が必要ない場所で回転を記録するために使用されます。 四元数の異なるビューで上記の混乱を恐れているなら、あなたは落ち着くことができます。 四元数は非常に使いやすく、微妙な最適化が必要な非常にまれな場合にのみ内部構造が必要になる場合があります。 四元数の助けを借りて、残りの時間は何でも何でもねじることができ、 ヒンジロックなしでスムーズかつ美しく補間されます。



クォータニオンとは何ですか? ベクトルとその周りの回転という2つの部分に分けると理解しやすくなります。 あなたが球の中にいると想像してください。 手を伸ばして、球の内面に触れることができます。 ベクトルになります。 ブラシを回して球体を回転させると、クォータニオンの2番目のコンポーネントが得られます。 四元数は、開始位置から取得される最終回転です。



四元数にはcな内部構造があります。 4つの数値を使用して記述できます。ベクトルはx、y、z、回転はwです。 難点は、それらに加えて、3つの虚数単位がまだあるという事実にあります。i2 = j 2 = k 2 = ijk = -1です。 エントリ全体は次のとおりです。q = w + x * i + y * j + z * k



ユニットが原因で、手動で四元数を乗算することはかなり面倒ですが、幸いなことに、プログラミングではそれらは特に重要ではありません。 通常、すべての操作は四元数全体で実行され、これらの4つの数値のみはほとんど使用されません。 さらに、多くのライブラリには、Unity3dのQuaternion.EulerやXNAのQuaternion.CreateFromYawPitchRollなど、より理解しやすい構造からクォータニオンを取得できる特別なコンストラクターがあります。



四元数を扱うとき、ほとんどの場合、それらを互いに乗算する必要があります。 これは非常に便利な操作です。1つのクォータニオンを別のクォータニオンと乗算すると、最初の回転が2番目の回転で回転するためです。 四元数の乗算は可換ではないことを覚えておくことが重要です。つまり、オペランドの順序が重要です。 つまり、q 1 * q 2はq 2 * q 1と同じではありません。 下の写真で違いを確認できます。 左:Quaternion.Euler(60、0、60)* Quaternion.Euler(0、60、0)、右:Quaternion.Euler(0、60、0)* Quaternion.Euler(60、0、60) 色付きの線は、各飛行機のローカル軸の経路を示しています。







実際には、クォータニオンの操作は次のようになります。



var rightTurn = Quaternion.Euler(0, 90, 0); //     car.rotation = car.rotation*rightTurn; // 
      
      





上記の例では、車はローカル座標で右に回転します。 車が傾斜面を走行している場合、または逆さまになっている場合でも、希望する場所に正しく曲がります。 rightTurn変数は、このように何度でも使用できます。たとえば、360度の回転は次のようになります。



 car.rotation = car.rotation*rightTurn*rightTurn*rightTurn*rightTurn;
      
      





デフォルトでは、クォータニオンはグローバル座標軸を使用して回転をカウントします。 1つのクォータニオンに別のクォータニオンを乗算すると、2番目のクォータニオンでは、最初のクォータニオンが基準点になります。



オイラー角を使用して、スーパーマリオギャラクシーのようなさまざまな凸面上での移動を突然シミュレートしたい場合は、長時間脳を動かさなければなりません。 これは、アニメーションではなく、空間内のオブジェクトの特定の方向を示すために発明されたためです。 クォータニオンを使用すると、すべてがはるかに簡単になり、最短経路に沿って著しく補間されますが、オイラー角はターンの階層のために飛び始め、多くの場合、この記事で書いたヒンジロックに閉じ込められます。 以下のアニメーションでは、球面補間がどれほど大きく異なるかを確認できます。 左側の四元数、右側のオイラー角。







それでも四元数が内部にどのように見えるか疑問に思うなら、以下の表を見ることができます。

w x y z 回転
1 0 0 0 回転なし
0 1 0 0 x軸の周りに180°
sqrt(0.5) sqrt(0.5) 0 0 X軸を中心に90°
sqrt(0.5) -sqrt(0.5) 0 0 x軸の周りに-90°


表の値は、次の式から取得されます。



 [w, x, y, z] = [cos(alpha/2), sin(alpha/2)*vx, sin(alpha/2)*vy, sin(alpha/2)*vz]
      
      





ここで、 alphaは回転角度、 vx、vy、vzは回転軸のベクトルです。



四元数の追加の結果は、中間回転です。 四元数の追加は基本的なものであり、コンポーネントを追加するのに十分簡単です。 たとえば、q 1 = 1 + 0i + 0j + 0k(上の表のゼロ回転)とq 2 = 0 + 1i + 0j + 0k(X軸の周りに180°)を考えます。 それらの合計はq 3 = 1 + 1i + 0j + 0k、つまりX軸を中心に90°になります残念ながら、Unity3dでは四元数に対して加算演算子は実装されていません。



クォータニオンについて詳しく知りたい場合は、 英語版ウィキペディアから始めることをお勧めします。 Wolfram | Alphaを掘り下げることもできます。これは膨大な関連情報を生成し、一般に多くのことを知っています。 以下のリンクを使用して、インタラクティブデモでオイラー角と四元数の違いを確認することもできます。



映像


WebGL | Windows | Linux | Mac | GitHubソース

マウスを使用してシーンを回転します。AD、WS、およびQE-軸の周りの回転、Esc-終了、残りのボタンは画面に表示されます。

Linuxユーザーの場合:「chmod + x Quaternions」を使用してQuaternionsファイルを実行可能にし、実行します。



All Articles