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();
カメラのようなぐらつき、私が実行しようとしている回転は、現在の変換に対して相対的ではないようです。
私は何が間違っているのですか?