9

クォータニオンローテーションがどのように機能するかを理解しようとしています。このミニチュートリアルhttp://www.julapy.com/blog/2008/12/22/quaternion-rotation/を見つけましたが、彼は私がトレーニングできないといくつかの仮定をしています。 、「軸の周りでベクトルを回転させるだけで、各軸の周りの回転ベクトルを計算する」方法のように、彼はどのようにangleDegreesX、angleDegreesY、angleDegreesZを計算しますか?

誰かが実用的な例や説明を提供できますか?

4

2 に答える 2

19

可能な限り最短の要約は、クォータニオンは回転行列の単なる省略形であるということです。4x4マトリックスには16個の個別の値が必要ですが、クォータニオンは4でまったく同じ回転を表すことができます。

数学的に傾倒している人にとっては、上記が非常に単純化されていることを十分に認識しています。

もう少し詳細を提供するために、ウィキペディアの記事を参照してみましょう:

ユニットクォータニオンは、オブジェクトの方向と回転を3次元で表すための便利な数学表記を提供します。オイラー角と比較して、構成が簡単で、ジンバルロックの問題を回避できます。回転行列と比較して、それらはより数値的に安定しており、より効率的である可能性があります

その冒頭の段落から明らかではないのは、クォータニオンは便利であるだけでなく、ユニークであるということです。オブジェクトの特定の方向があり、任意の数の軸でねじれている場合、その方向を表す単一の一意のクォータニオンが存在します。

繰り返しますが、数学的に傾倒している場合、上記の私の独自性のコメントは右利きの回転を想定しています。反対の軸を中心に反対方向に回転する同等の左手系クォータニオンがあります。

簡単に説明するために、それは違いのない区別のようなものです。

軸を中心とした回転を表す単純なクォータニオンを作成する場合は、次の一連の手順でそこに到達します。

  1. 回転軸を選択しますv = {x, y, z}。丁寧さのために、単位ベクトルを選択してください。まだ長さが1でない場合は、すべてのコンポーネントをvの長さで割ります。
  2. この軸を中心に回転させたい回転角を選択し、それを呼び出しますtheta
  3. 同等の単位クォータニオンは、以下のサンプルコードを使用して計算できます。

クォータニオン構造:

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つの回転に相当するクォータニオンは異なり、一方を他方と混同することはできません。

編集:コメントの質問に答える:

次の参照フレームを設定して、問題を単純化しましょう。

  1. 画面の中心を原点として選択します(その周りを回転します)。
  2. X軸は右を指します
  3. Y軸が上を向いている(画面上部)
  4. 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};
于 2011-06-08T15:09:14.163 に答える
0

必要なことを行うには、いくつかの基本的な数学が必要です。基本的に、回転行列を使用してその点を表す行列を乗算することにより、軸を中心に点を回転します。結果は、その点の回転行列表現です。

この線

angleX = angleDegreesX * DEGTORAD;

度の表現を単純な式によってラジアン表現に変換するだけです(ラジアンに関するこのウィキペディアのエントリを参照してください) 。

ここで、いくつかの詳細情報と回転行列の例を見つけることができます:任意の軸を中心とした回転

プログラミングフレームワークには、その回転作業を実行して行列を取得するためのツールがおそらくあります。残念ながら、クォータニオンについてはお役に立てませんが、問題はもう少し基本的なようです。

于 2011-06-08T15:16:22.730 に答える