2012-03-28 5 views
0

オブジェクトのモデル行列を使用してOpenGLにオブジェクトを表示しています。これは、あらかじめ格納されているオブジェクトの場所と回転に適用された四元数から構築します。回転と変形が適用された後(オブジェクトが画面上に現れる座標)に、最後のデカルト座標をで見つけ出す必要があります。オブジェクトです。どのように私は平らな座標を得ることができますか?モデル行列または四元数から最終的な世界座標を求める

+1

あなたは何を求めているのかよくわかりません...マトリクスにポイント座標ベクトルを掛けますか?ただし、画面上の位置を取得する場合は、カメラの行列も考慮する必要があります。 – cooky451

+1

@ cooky451:ビューマトリックスは1つだけです。投影マトリックス(カメラと混同しないでください)と正規化ステップもあります。 – datenwolf

+0

私は、回転を適用してオブジェクトのワールド座標を取得しようとしています(最終位置)。私は原点でオブジェクトを回転させないので、オブジェクトは非原点位置で回転するためにある程度のオフセットがあります。私は私が見ているその位置を見つける必要があります。 –

答えて

2

私が正しく理解している場合は、オブジェクトがあります。変換を適用せずにレンダリングした場合、その中心は[0,0,0]になります。

3D空間内に[a、b、c]というポイントがあります。モデルビューマトリックスに翻訳を適用します。ここでオブジェクトをレンダリングすると、その中心はワールド空間の座標で[a、b、c]になります。

あなたはクォータニオン、[qw、qx、qy、qz]を持っています。この場合、create a rotation matrixMをモデルビューマトリックスに適用します。今度は、世界空間内のオブジェクトの中心の新しい座標である[a '、b'、c ']を知りたいとします。

これがtrueの場合、最も簡単な方法は、ちょうど行列の乗算を自分で行うことです。

a' = m11*a + m12*b + m13*c 
b' = m21*a + m22*b + m23*c 
c' = m31*a + m32*b + m33*c 

[m11 m12 m13] 
M = [m21 m22 m23] 
    [m31 m32 m33] 

しかし、おそらくあなたが実際にMを構築していません。もう1つの方法は、クォータニオンを直接使用することですが、基本的に回転行列を作成してから使用します。

gluProjectを実際に使用する必要はありません。回転をmodelview行列に適用すると、行列の乗算がそこで実行されます。モデルビュー行列は、モデルの原点を移動している場合これはあなたに伝え

double mv[16]; 
glGetDoublev(GL_MODELVIEW_MATRIX,mv); 
a' = mv[13]; 
b' = mv[14]; 
c' = mv[15]; 

:だから、あなただけのマトリックス自体から値を得ることができます。

+0

私は同様の方法でメソッドを実装しましたが、これはもっと簡単です。偉大な答えは、私は非常にすぐに来ている私の将来のプロジェクトであなたの方法を使用すると確信しています:) –

+0

ありがとう、これは私を助けた。参考までに、glGetDoublevには小文字のvを付ける必要があります。あなた自身で変更するためにあなたの回答を編集したいと思いますが、1文字の編集をすることはできません。 –

+0

@Mitch Thanks。それを私が直した。 – JCooper

1

gluProject()を再実装し、ビューポートトランスフォーム以外のすべてを適用します。

+0

少し残虐ではないでしょうか?私は行列と投影にはあまり良くないので、もっと簡単な方法があれば、最後の選択肢になるはずですか?またはgluProjectがシンプルな場合は、簡単な説明を見つけることができます(私が見つけたのは混乱しています) –

+0

または現在の行列を押して、ビュー行列としてIDをロードし、モデル行列をmodelview行列としてロードして呼び出しますgluProjectは動作しますか? –

関連する問題