2010-12-07 6 views
4

挨拶全て、画像に見られるようOpenGL、ワールドツーオブジェクトの座標マッピングですか? (逆行列)

alt text

IはO(linestripesのセット).Itsオブジェクト座標系名前付きオブジェクトを有する(X」であり、 y '、z')である。私が翻訳し は、次のコードスニペットを使用して、私のOpenGLのシーンでこのオブジェクトを回転させる:

glPushMatrix(); 
glTranslatef(Oz, Oy,Oz); 
glRotatef(rotationX , 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glRotatef(rotationZ, 0.0, 0.0, 1.0); 
contour->render(); 
glPopMatrix() 

私は

私が正しいだ場合

glPushMatrix(); 
glTranslatef(hx,hy,hz); 
glPopMatrix(); 
、(オズ、オイ、オズ)及び(HX、HYを使用して座標(HX、HY、Hz)で世界に翻訳さHと呼ばれるポイントを、持っています、 hz)は世界座標です。

ここで、Oのオブジェクト座標系(x '、y'、z ')に対するH(hx、hy、hz)の位置を計算します。 私が理解したように、私はオブジェクトOの逆変換を計算し、点Hに適用することでこれを行うことができます。

これに関するヒント? OpenGLは逆行列計算のための関数を提供していますか?どういうわけか逆行列を見つけたら、それらを乗算する順序は?

注:ポイントHでは、半径Rの球を描画するツールのようなハンマーを実装したいと思います。ユーザーはこの球を使用して、ハンマーのようにオブジェクトOを切り取ることができます。これを2Dで実装しました。ハンマーの位置を計算できるのであれば、同じアルゴリズムを使うことができます。 (x '、y'、z ')に対する相対

ありがとうございます。

+1

私があなたの質問を理解していれば、 '{Ox-hx、Oy-hy、Oz-hz} '(つまり' glTranslatef(Ox-hx、Oy-hy、Oz-hz) )?あなたが既にグローバルベクトル 'O'と' h'を持っているならば、それはベクトル減算の単純な問題です。ところで、オリジナルのソリューションは正しいと言えます。 – MrGomez

+0

こんにちは、私はオブジェクトOの元のオブジェクト座標を変更する必要があります。つまり、私は世界座標ではなく、オブジェクト座標を比較する必要があります。 –

+1

心配はいりません。速いリフレッシャーは、OpenGLが汎用マトリックスライブラリを提供していないことを思い出させました。それには別のライブラリを使用するか、計算を実行する必要があります(http://mathworld.wolfram.com/MatrixInverse.html)。 – MrGomez

答えて

2

行列を反転することは一般的な解決策になりますが、私が見る限り、これは実際には「一般的な」問題ではありません。任意の変換を取り消すのではなく、変換の既知のシーケンスの逆を実行しようとしています。それぞれの変換は非常に単純に反転できます。あなたのオブジェクトへの世界変換がある場合:

glTranslatef(Ox, Oy, Oz); 
glRotatef(rotationX , 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glRotatef(rotationZ, 0.0, 0.0, 1.0); 

その後の世界とオブジェクトの逆だけである:

glRotatef(-rotationZ, 0.0, 0.0, 1.0); 
glRotatef(-rotationY, 0.0, 1.0, 0.0); 
glRotatef(-rotationX , 1.0, 0.0, 0.0); 
glTranslatef(-Ox, -Oy, -Oz); 

基本的には、ちょうど戻って、それぞれが元々適用逆の順序で変換を適用します。

2

あなたはすでにあなたは、このためのOの逆を必要とする推測のようにはい、基本的にはあなたがどんなあなたが

M = O^-1 * H

翻訳行列でこの操作を実行できることですね。 OpenGLは数学ライブラリではありませんが、レンダリングだけを扱います。だから、自分で逆転を実装する必要があります。 1つの可能なアルゴリズムを見つけるために "ガウスヨルダン"のGoogle。もしあなたが絶対に確信が持てるならば、そのOは回転と平行移動のみで構成されています。つまり、せん断やスケーリングがない場合、左上の3x3サブ行列を入れ替えて右端の列の最上位の3要素を否定することでショートカットできます転置行列も同様に逆行列であり、左上の3x3は回転部分であり、逆変換は逆行列であり、右上の3つの要素であるベクトルの要素を否定する)。

関連する問題