4

みなさん、こんにちは。

画像に見られるように、

代替テキスト

O(ラインストライプのセット)という名前のオブジェクトがあります。そのオブジェクト座標系は(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()

;

私はHと呼ばれる点を持っています。これは、を使用して(hx、hy、hz)世界座標に変換されます。

glPushMatrix();
 glTranslatef(hx,hy,hz);
glPopMatrix();

私が正しければ、(Oz、Oy、Oz)と(hx、hy、hz)は世界座標です。

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

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

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

前もって感謝します。

4

2 に答える 2

2

はい、基本的には、変換行列によってこの操作を実行できるのは正しいです

M = O ^ -1 * H

あなたがすでに推測したように、これにはOの逆が必要です。OpenGLは数学ライブラリではありませんが、レンダリング関連のものだけを扱います。したがって、反転を自分で実装する必要があります。「ガウスジョーダン」のためのグーグルは1つの可能なアルゴリズムを見つけるために。Oが回転と並進のみで構成されている、つまりせん断やスケーリングがないことを絶対に確信できる場合は、左上の3x3部分行列を転置し、右端の列の最上部の3つの要素を無効にすることでショートカットできます(これは直交の性質を利用します)回転行列のように、転置も逆行列であり、左上の3x3は回転部分であり、変換の逆行列は、右上の3つの要素であるベクトルの要素を否定します。

于 2010-12-07T09:34:30.820 に答える
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);

基本的に、最初に適用されたのとは逆の順序で、適用された各変換を元に戻します。

于 2010-12-07T09:52:02.403 に答える