1

オブジェクトを原点で回転させた後、ワールド空間でオブジェクトを変換しようとしています。問題は、原点にあるオブジェクトを回転させた後、そのローカル座標系も回転するため、その軸がワールド座標軸と平行ではなくなることです。したがって、たとえば、オブジェクトを y 軸を中心に回転させた後に点 (3, 0, 5) に移動する必要がある場合、オブジェクトのローカル座標系がワールド座標系と同じ。例えば:

glRotatef(45, 0.0, 1.0, 0.0);
glTranslatef(3.0, 0.0, 5.0);
glutSolidCube(1);               // This won't be at (3,0,5) like how I need it

どうすればこれを克服できますか?

4

2 に答える 2

2

これはOpenGLの特性ではなく、行列演算です。

頂点をOpenGL固定関数パイプラインに送信すると、モデルビューと射影の行列によって変換されます。

 v_eye = MODELVIEW · v
v_clip = PROJECTION · v_eye

これで、modelviewマトリックスはこれらすべてのサブ変換で構成されます。そして、それらは可換ではありません。つまり、操作の順序が重要です。例えば

MODELVIEW = T_0 · R_0 · R_1 · T_1 · S_1 · R_2

これで、上記のv_eye計算を次のように書き直すことができます。

v_eye = T_0 · ( R_0 · ( R_1 · (T_1 · (S_1 · (R_2 · v)))))

ご覧のとおり、vは(行列のように)右から左に、モデルビューを作成した行列のスタックに乗算されます。

ただし、OpenGLで発生するのは、1つの行列「MODELVIEW」が計算され、vはその4×4の数値スキームでのみ変換されるということです。OpenGLは、すべての行列乗算ステップを「再実行」するわけではありません。

于 2012-10-30T07:59:50.383 に答える
-1

OpenGL ステートメントは GPU で逆の順序で実行されます。

したがって、最初に平行移動してから回転します。

于 2012-10-30T07:05:29.757 に答える