вращающиеся объекты в opengl - PullRequest
1 голос
/ 05 марта 2012

Мне нужно повернуть сцену по оси, когда я нажимаю клавишу. Вот как я это реализовал

    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;

и настройте мою вращающуюся сцену на

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

Все идет хорошо, когда я выполняю вращение на отдельной оси, однако, когда я сначала поворачиваюсь по Y, а затем выполняю вращение по X, вращение сцены неверно. Возможно, это связано с тем, что opengl выполнял вращение по X сначала, а затем по Y из-за упорядочения в вызове функции. Я не могу использовать эту функцию должным образом, так как порядок поворота сцены важен для моего приложения.

1 Ответ

1 голос
/ 05 марта 2012

Используйте glPushMatrix(), чтобы поместить матрицу в стек матрицы, и glPopMatrix(), чтобы вернуть ее обратно.

...