0

初期ポーズ 回転後望ましくない影響 望んでいた効果OpenGL で簡単なアプリケーションをプログラミングしています。中心 (ローカル座標) を中心に回転させたいモデルがあり、ローカル座標も一緒に変換します。回転してから平行移動するシナリオと、その逆のシナリオの 2 つを実行しました。最初のシナリオでは、正しい回転が得られましたが、モデルはモデル (ローカル) 座標ではなくワールド座標に基づいて変換されます。最初に平行移動すると、正しく平行移動できましたが、回転がモデルの中心を中心としていません。ここにコードがあります、

glPushMatrix();

// ignore this
/*glRotatef(_zRoll, 0.0, 0.0, 1.0);
glRotatef(_yTilt, 1.0, 0.0, 0.0);
glRotatef(_xPan, 0.0, 1.0, 0.0);*/
glScalef(scale, scale, scale);
glTranslatef(0.0, 0.0, -2.0);
glTranslatef(_xTranslate, _yTranslate, _zTranslate); // The required translation
// The required rotation
glRotatef(_yangle, 0.0, 1.0, 0.0);
glRotatef(_zangle, 0.0, 0.0, 1.0);
glRotatef(_xangle, 1.0, 0.0, 0.0); 
glTranslatef(coord.x, coord.y, coord.z); // translate to the model center

glCallList(aHelix);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glPopMatrix();

glutSwapBuffers();
4

1 に答える 1

0

私はあなたが探しているものを今理解していると思います。私はあなたが望むものを再言しようとしますので、間違っている場合は修正してください.

次の頂点座標を持つ単純なモデルを見てみましょう (列は頂点です)。

[3  2  3  4]
[5  2  3  2]
[0  0  0  0]
[1  1  1  1]

したがって、最初のポイントは x=3、y=5、z=0 です。このモデルを描画すると、次のようになります。

オリジナルモデル

モデルを単純に回転させ (この場合は 43°)、Y 方向 (上) に、たとえば 4 単位平行移動すると、次のようになります。

モデルを回転して平行移動 Y

モデルは Y 方向に 4 単位移動しましたが、ワールド座標フレーム内です。私が理解しているように、上記の結果はあなたが望まないものです。

代わりに、モデルを回転後に指している方向に平行移動すると、次のようになります。

モデルを回転させた後、角度を付けて平行移動

これは、あなたが望むものだと私は信じています。これが私が使用したコードです。

glTranslatef(3.0, 3.0, 0.0);
glTranslatef(-2.728, 2.924, 0.0);
glRotatef(43.0, 0.0, 0.0, 1.0);
glTranslatef(-3.0, -3.0, 0.0);  

最初にモデルを 43 度回転させてから、更新されたローカル Y 方向に従って移動させます。[0 4 0 0]ベクトルを取得し、モデルに使用したのと同じ 43° 回転行列を使用して回転させることで、ハードコーディングされた並進ベクトルを取得しました。これをプログラムで行うのは簡単ではなく (少なくとも固定パイプラインでは)、その後のローテーションで悪化します。

[0 4 0 0]ただし、最初に平行移動を実行し、次に回転を実行すると、まったく同じ結果 (手動で確認できます) が得られることがわかります。

glTranslatef(3.0, 3.0, 0.0);
glRotatef(43.0, 0.0, 0.0, 1.0);
glTranslatef(0.0, 4.0, 0.0);
glTranslatef(-3.0, -3.0, 0.0);  

比較のための 2 番目のコード セットの結果を次に示します。

モデルを移動してから回転

問題は、その後の回転/平行移動を行うと、座標系がすべて台無しになることです。これを回避するには、回転と移動にアキュムレータを使用していることを確認し、小さな増分変更を行うのではなく、それらをすべて一度に元のモデルに適用する必要があります。したがって、上矢印キーを_yTranslate押すたびに、変数に増分値を追加し、「回転」ボタンを押すたびに、に値を加算または減算_zangleします。

于 2014-10-06T01:12:22.170 に答える