2012-03-04 19 views
1

私はキーを押すと、軸でシーンを回転させる必要があります。これは私が実装した方法です。openglのオブジェクトを回転する

int rotateFlag; 

    void rotateScene(int x){ 
     if(x)//rotate 45 deg on x axis 
      glRotatef(45,1,0,0); 
     else // roatate 45 deg on y axis 
      glRotatef(45,0,1,0); 
    } 

    //this is the function I call in glutDisplayFunc 
    void drawScene(void){ 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     //I'm looking at the origin (center of my scene) 
     gluLookAt (x, y, z, 0,0,0, 0.0, 1.0, 0.0); 

     rotateScene(rotateFlag); 

     drawObjects();//draw Objects in Scene 

    } 

私は左キーまたは上キーを押したときにrotateFlagに値を割り当てます。私の関数rotateScene は常にが私が避けるべきシーンの元の配列にglRotatefを適用して以来、これはシーンを1回だけ回転させます。誰かが回転したシーンを保存する方法を知っていますので、回転したシーンに私の機能を適用し、矢印キーを押すたびにシーンを回転させることができますか?私は自分自身を明確にしたいと思う。

私はキー

If keypress left 
     angleX+=45; 
    else if keypress up 
     angleY+=45; 

を押すと、私は個別に回転を実行したときにすべてがうまくいっている

void rotateScene(){ 
     glRotatef(angleX,1,0,0); 
     glRotatef(angleY,0,1,0); 
    } 

に私のrotateSceneを調整するように私はXとYに角度をインクリメントすることにより、別の解決策を試してみましたしかし、最初にYで回転した後にXで回転すると、シーンの回転が正しくありません。これは、関数呼び出しの順序付けのために、openglがXで回転してからYで回転するためです。私のアプリケーションでは、シーンを回転させる順序が重要なので、この関数を適切に使用することはできません。

+0

回転は可換ではありません。簡単に言えば、これは、Xの周りを回転してからYの周りを回転することは、Yの周りを回転してからXの周りを回転することと同じではありません。これは単純な数学的原理であり、実際には多くの混乱を招きます。 OpenGLで軸を中心に回転させるたびに、座標系が向きを変えます。一方、翻訳は問題ではありません。最初にXに沿って翻訳し、次いでYに沿って翻訳し、次にZに沿って翻訳することは、まずYに沿って翻訳し、次にXに沿って翻訳し、最後にZに沿って翻訳することと同じです。一方で適用された)。 – rbaleksandar

答えて

1

glPushMatrix()を使用してマトリックスをマトリックススタックにプッシュし、glPopMatrix()を使用して戻します。

関連する問題