2011-12-15 49 views
0

OpenGLでオブジェクト(惑星)を現在のカメラの回転に対して相対回転させるのに問題があります。最初はうまくいくようですが、ちょっと回転させた後、回転はカメラではなくなりました。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(); 

、現在の変換に関連していないようです。

私は間違っていますか?

答えて

5

GAH! Do not do:

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は数学ライブラリではありません。その種の仕事のための適切な線形代数ライブラリがあります。


ベクトルが回転を格納するのに適していません。あなたは少なくともベクトル(回転の軸)と角度そのもの、あるいはより良い四元数を必要とします。

ローテーションは追加されません。それらは可換ではありませんが、追加は可換的な操作です。実際には回転はを掛けてとなります。

コードを修正するには:適切な数学的方法を使用してゼロから書き直します。これについては、「Rotation Matrices」と「Quaternions」(Wikipediaにはそれらがあります)のトピックをお読みください。

関連する問題