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(); // возвращаемся к старым координатам
Как видите, конус повернулся в абсолютных координатах. Так что, для того,
чтобы нарисовать фигуру не в начале координат, надо:
- сохранить текущие координаты
- сдвинуть(glTranslated), повернуть(glRotated)
- нарисовать то, что хотели
- вернуться к старым координатам
Вызовы 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.
|