вращающиеся объекты в 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 сначала выполнял вращение по X, а затем вращение по Y из-за порядка в вызове функции. Я не могу правильно использовать эту функцию, так как в моем приложении важен порядок поворота сцены.


person Gabriella Alice Karin    schedule 04.03.2012    source источник
comment
Вращение не коммутативно. Проще говоря, это означает, что вращение вокруг X, а затем вокруг Y — это не то же самое, что вращение сначала вокруг Y, а затем вокруг X. Это простой математический принцип, который действительно вызывает много путаницы. Каждый раз, когда вы делаете поворот вокруг оси в OpenGL, система координат меняет свою ориентацию. Перевод, с другой стороны, не является проблемой - перемещение сначала по X, затем по Y, а затем по Z равносильно перемещению сначала по Y, затем по X и, наконец, по Z. Мы достигаем одной и той же точки в пространстве (если вращение не применяется между тем).   -  person rbaleksandar    schedule 27.02.2014


Ответы (1)


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

person Tobias Schlegel    schedule 05.03.2012