2011-07-29 18 views
2

を角度変換OpenGLの4×4行列は、Iは、OpenGLに glGetFloatv(GL_MODELVIEW_MATRIX、(フロート*)x)を有するモデル行列抽出い

そしてx、yおよびz得られる4×4行列から抽出したいです軸回転。どうやってやるの ? ありがとう!

+0

このSOQを見http://stackoverflow.com/questions/1766284/opengl-position-and-orientation-from-modelview-matrix – epatel

+0

おかげで、私はそれにスクリプトを適用しようとしましたが、結果は実際には正しくありません。例えば。私はOpenGL xyz rot = [80,80,80]に設定し、あなたのリンクのスクリプトは私に[-85,70、-85]を返します。なぜこれができるのか?ありがとう! –

+0

回転の順番は非常に重要です。xyzはzyx(多分)を適用する必要があるかもしれませんが、通常はオイラー角と呼ばれます。http://en.wikipedia.org/wiki/Euler_angles and wing – epatel

答えて

3

まず、オイラー角と呼ばれるx、y、z軸の回転は、深刻な数値問題に苦しんでいることを知っておくべきです。また、彼らはあいまいではありません。したがって、回転角と回転軸を格納することで、効果的に四方数を変装するか、フル回転行列に固執します。

回転行列から四元数を求めることは、固有値問題と呼ばれます。技術的には、回転行列の固有ベクトルを決定します。これは軸であり、大きさは角度を指定します。

+0

私は3つの変数に自分のアングルを格納し、OpenGLの私の描画機能では、これらのアングルで3倍のglRotateを実行するので、私はそれが好きです。今私はこれらの3つの軸のうちの1つをさらに回転させたいので、glRotateを追加して、新しい回転角度を再格納するために行列をシステムに再入力します。それを行うにはより良い方法がありますか? –

+2

@Laurent Crivello:オイラー角で回転を保存しないでください。混乱と狂気があなたを待っています。代わりに、回転を1つの四元数として格納します。その四元数に乗算することによって、さらに回転が適用されます。クォータニオンを回転行列に変換することは自明であり、これはglMultMatrixを使ってOpenGL行列スタックに適用することができます。さらに、OpenGLを数学ライブラリとして扱うべきではありません。 OpenGL-3はすべての行列操作関数を削除したので、ユーザは行列自体を追跡する必要がありました。これはあなたがしていることから人々を守るためです。 – datenwolf

+0

基本的には、x、y、zを別々の角度で配列に保持してglRotateコマンドを使うのではなく、3x3回転行列を保持し、それに現在の行列を掛けるべきでしょうか? –

0

このようなものは、あなたが何をしているかを示すはずです。私は私は2つの4×4の行列(2次元の点の間、すなわちカメラの動き)に由来しました2つの四元間を補間するSLERPを使用しているときにカメラアングルを印刷する効用関数としてこれを使用

final double roll = Math.atan2(2 * (quat.getW() * quat.getX() + quat.getY() * quat.getZ()), 
      1 - 2 * (quat.getX() * quat.getX() + quat.getY() * quat.getY())); 
final double pitch = Math.asin(2 * (quat.getW() * quat.getY() - quat.getZ() * quat.getY())); 
final double yaw = Math.atan2(2 * (quat.getW() * quat.getZ() + quat.getX() * quat.getY()), 1 - 2 * (quat.getY() 
      * quat.getY() + quat.getZ() * quat.getZ())); 

+0

この回答をありがとう。しかし、四元数は4x4行列です。最初の3x3が回転に使用されます。しかし、あなたのコードでmat [0-1-2/4-5-6/8-9-10]とgetX、Y、Z、Wの間のマッピングを取り出すことはできません。ありがとう! –

+0

Javaとvecmathライブラリを使用している場合は、Quat4d quaternion = new Quat4d();でQuaternionを作成できます。 quaternion.set(yourMatrix); ' –

1

私はあなたの問題を理解しているので、オイラー角が線形変換のためにどれだけひどいのかを知っていますが、エンドユーザーは行列やクォータニオンよりはるかに直感的です。

私のアプリでは、Ken Shoemakeの素晴らしいアルゴリズムを解釈しました。それは、任意のローテーションオーダーをサポートする非常に少数のものの1つです。それは93年のものなので、純粋なCコードになっています。

http://tog.acm.org/resources/GraphicsGems/gemsiv/euler_angle/

関連する問題