可能な限り最短の要約は、クォータニオンは回転行列の単なる省略形であるということです。4x4マトリックスには16個の個別の値が必要ですが、クォータニオンは4でまったく同じ回転を表すことができます。
数学的に傾倒している人にとっては、上記が非常に単純化されていることを十分に認識しています。
もう少し詳細を提供するために、ウィキペディアの記事を参照してみましょう:
ユニットクォータニオンは、オブジェクトの方向と回転を3次元で表すための便利な数学表記を提供します。オイラー角と比較して、構成が簡単で、ジンバルロックの問題を回避できます。回転行列と比較して、それらはより数値的に安定しており、より効率的である可能性があります
その冒頭の段落から明らかではないのは、クォータニオンは便利であるだけでなく、ユニークであるということです。オブジェクトの特定の方向があり、任意の数の軸でねじれている場合、その方向を表す単一の一意のクォータニオンが存在します。
繰り返しますが、数学的に傾倒している場合、上記の私の独自性のコメントは右利きの回転を想定しています。反対の軸を中心に反対方向に回転する同等の左手系クォータニオンがあります。
簡単に説明するために、それは違いのない区別のようなものです。
軸を中心とした回転を表す単純なクォータニオンを作成する場合は、次の一連の手順でそこに到達します。
- 回転軸を選択します
v = {x, y, z}
。丁寧さのために、単位ベクトルを選択してください。まだ長さが1でない場合は、すべてのコンポーネントをvの長さで割ります。
- この軸を中心に回転させたい回転角を選択し、それを呼び出します
theta
。
- 同等の単位クォータニオンは、以下のサンプルコードを使用して計算できます。
クォータニオン構造:
q = { cos(theta/2.0), // This is the angle component
sin(theta/2.0) * x, // Remember, angle is in radians, not degrees!
sin(theta/2.0) * y, // These capture the axis of rotation
sin(theta/2.0) * z};
これらの2つの分割に注意してください。これらは、ローテーションで混乱が生じないようにします。通常の回転行列では、右に90度回転することは、左に270度回転することと同じです。これらの2つの回転に相当するクォータニオンは異なり、一方を他方と混同することはできません。
編集:コメントの質問に答える:
次の参照フレームを設定して、問題を単純化しましょう。
- 画面の中心を原点として選択します(その周りを回転します)。
- X軸は右を指します
- Y軸が上を向いている(画面上部)
- Z軸は、画面の外を向いています(右手の座標系を形成しています)。
したがって、右(正のx軸)を指すことから始まるサンプルオブジェクト(たとえば矢印)がある場合。マウスをx軸から上に動かすと、マウスは正のxと正のyを提供します。したがって、一連の手順を実行します。
double theta = Math.atan2(y, x);
// Remember, Z axis = {0, 0, 1};
// pseudo code for the quaternion:
q = { cos(theta/2.0), // This is the angle component
sin(theta/2.0) * 0, // As you can see, the zero components are ignored
sin(theta/2.0) * 0, // Left them in for clarity.
sin(theta/2.0) * 1.0};