Chapter 2
Быстрый старт

2.6  Поворот координат

     Теперь рассмотрим вращение координат. Создайте новый проект с именем Rotate. Переименуйте glaux.c в rotate.c В функцию display вставьте следующий код:

glColor3d(1,0,0);
auxSolidCone(1, 2);  // рисуем конус в центре координат

glPushMatrix();     // сохраняем текущие координаты
 glTranslated(1,0,0);  // сдвигаемся в точку (1,0,0)
 glRotated(75, 1,0,0); // поворачиваем систему координат на 75 градусов
 glColor3d(0,1,0);
 auxSolidCone(1, 2);   // рисуем конус
glPopMatrix();     // возвращаемся к старым координатам

Как видите, конус повернулся в абсолютных координатах. Так что, для того, чтобы нарисовать фигуру не в начале координат, надо:

  1. сохранить текущие координаты
  2. сдвинуть(glTranslated), повернуть(glRotated)
  3. нарисовать то, что хотели
  4. вернуться к старым координатам

Вызовы glPushMatrixglPopMatrix могут быть вложенными, т.е.:

glPushMatrix();
  …
   glPushMatrix();
   glPopMatrix();
  …
glPopMatrix();

     Естественно, число вызовов glPopMatrix должно соответствовать числу вызовов glPushMatrix, иначе у вас сцена улетит в неизвестном направлении. Максимально допустимая глубина вложенности glPushMatrix/glPopMatrix определяется следующим образом:

int n;
glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH, &n);
printf("n=%d\n",n);
Спецификация на OpenGL гарантирует, что глубина стека не может быть меньше 32.