2012-03-04 128 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應用於我應該避免的場景的原始佈局。有人知道我如何保存旋轉的場景,這樣我就可以對其應用我的功能(旋轉的場景),並且每次按下箭頭鍵時旋轉場景?我希望我明確自己。

我通過增加在X和Y的角度嘗試另一種解決方案,因爲我按下鍵

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

和調整我的rotateScene到

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

當我個人進行旋轉一切都在朝好的方向發展但是,當我做Y首先旋轉然後我執行旋轉X,場景的旋轉是不正確的。也許這是因爲opengl在Y上旋轉之前首先執行旋轉,因爲函數調用中的順序。我無法正確使用這個功能,因爲在我的應用程序中,旋轉場景的順序非常重要。

+0

旋轉不可交換。簡而言之,這意味着圍繞X旋轉然後圍繞Y旋轉與圍繞Y旋轉Y並不相同。這是一個簡單的數學原理,確實引起了很多混淆。每當你在OpenGL中圍繞一個軸進行旋轉時,座標系都會改變它的方向。另一方面,翻譯不是一個問題 - 首先沿着X,然後沿着Y,然後沿着Z,先翻譯Y,然後沿X翻譯,然後沿着Z翻譯。我們到達空間中的相同點(除非旋轉具有同時應用)。 – rbaleksandar 2014-02-27 09:04:31

回答

1

使用glPushMatrix()將矩陣推送到矩陣堆棧並將glPopMatrix()推回到矩陣堆棧。