0

OpenGLでオブジェクト(惑星)を現在のカメラの回転に対して回転させるのに問題があります。最初は機能しているように見えますが、少し回転させた後、回転はカメラに対して正しく/相対的ではなくなります。

画面上のmouseXとmouseYの動きのデルタ(差)を計算しています。回転は「planetRotation」と呼ばれるVector3Dに保存されます。

これがplanetRotationを基準にした回転を計算するための私のコードです:

Vector3D rotateAmount;
rotateAmount.x = deltaY;
rotateAmount.y = deltaX;
rotateAmount.z = 0.0;

glPushMatrix();
    glLoadIdentity();
    glRotatef(-planetRotation.z, 0.0, 0.0, 1.0);
    glRotatef(-planetRotation.y, 0.0, 1.0, 0.0);
    glRotatef(-planetRotation.x, 1.0, 0.0, 0.0);
    GLfloat rotMatrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix);
glPopMatrix();

Vector3D transformedRot = vectorMultiplyWithMatrix(rotateAmount, rotMatrix);
planetRotation = vectorAdd(planetRotation, transformedRot);

理論的には、これは、「rotateAmount」変数に回転を設定します。次に、このベクトルに逆モデル変換行列(rotMatrix)を乗算することにより、これをモデル空間に取り込みます。

次に、この変換された回転が現在の回転に追加されます。

これをレンダリングするには、セットアップ中のトランスフォームを使用します。

glPushMatrix();
    glRotatef(planetRotation.x, 1.0, 0.0, 0.0);
    glRotatef(planetRotation.y, 0.0, 1.0, 0.0);
    glRotatef(planetRotation.z, 0.0, 0.0, 1.0);
    //render stuff here
glPopMatrix();

カメラのようなぐらつき、私が実行しようとしている回転は、現在の変換に対して相対的ではないようです。

私は何が間違っているのですか?

4

1 に答える 1

5

ガッ!そうしないでください:

glPushMatrix();
    glLoadIdentity();
    glRotatef(-planetRotation.z, 0.0, 0.0, 1.0);
    glRotatef(-planetRotation.y, 0.0, 1.0, 0.0);
    glRotatef(-planetRotation.x, 1.0, 0.0, 0.0);
    GLfloat rotMatrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, rotMatrix);
glPopMatrix();

OpenGL は数学ライブラリではありません。その種の仕事に適した線形代数ライブラリがあります。


あなたの問題について。ベクトルは、回転を格納するのに適していません。少なくともベクトル (回転軸) と角度自体、またはクォータニオンが必要です。

また、回転は追加されません。それらは可換ではありませんが、加算は可換演算です。回転は実際に乗算されます。

コードの修正方法: 適切な数学的手法を使用して、最初からコードを書き直します。これについては、「回転行列」と「四元数」のトピックを読んでください (ウィキペディアにはそれらがあります)。

于 2011-12-15T12:32:46.617 に答える