在opengl中旋转对象

时间:2012-03-04 22:15:47

标签: opengl graphics rotation image-rotation

当我按一个键时,我需要在轴上旋转场景。这是我实施它的方式

    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上执行旋转时,场景的旋转不正确。也许这是因为在Y上旋转之前首先在X上执行旋转,因为函数调用中的顺序。我无法正确使用此功能,因为在我的应用程序中旋转场景的顺序非常重要。

1 个答案:

答案 0 :(得分:1)

使用glPushMatrix()将矩阵推送到矩阵堆栈,并使用glPopMatrix()将其恢复回来。