Проблема преобразования OpenGL

Может кто-нибудь объяснить, что происходит в примере ниже:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRotatef(45,0,0,1);
DrawCube();
glTranslatef(4,0,0);
glRotatef(-45,0,0,1);
DrawCube();
glPopMatrix();

Я предполагаю, что он просто повернет квадрат, сдвинет его вправо на 4 единицы, а затем повернет обратно к исходному вращению. Хотя это кажется слишком простым, я что-то упускаю?


person sudo    schedule 28.10.2010    source источник


Ответы (1)


Грубо-

  • Убедитесь, что OpenGL применяет матричные операции к стеку представления модели.
  • Сохраните текущее значение стека (позже оно будет возвращено поп-музыкой)
  • Загрузите личность, очистив все без исключения повороты/преобразования/что угодно
  • Повернуть текущее матричное преобразование на 45 градусов вокруг оси X.
  • Нарисуйте куб (используя текущее матричное преобразование, которое было повернуто)
  • Переместите текущее матричное преобразование на 4 единицы по оси X
  • Повернуть текущее матричное преобразование на -45 градусов вокруг оси x.
  • Нарисуйте еще один куб, который был перемещен и повернут из положения первого куба.
  • Восстановите исходное матричное преобразование, которое было сохранено командой Push.

В результате получается два куба. Первый находится в центре и повернут на 45 градусов, а второй – на 4 единицы по оси повернутый x, и сам повернут на -45 градусов.

person luke    schedule 28.10.2010
comment
В таком случае верхняя и нижняя части каждого квадрата ложатся на одну и ту же ось X? Или одно выше другого? - person sudo; 28.10.2010
comment
Я не очень ясно выразился. Нет, они не будут на одной оси X. Перед переводом происходит поворот, поэтому ориентация оси X изменилась. - person luke; 28.10.2010
comment
Спасибо, я понимаю, поэтому он рисует это немного выше оригинала. - person sudo; 28.10.2010
comment
@LarsH, хорошие моменты. Я изменил язык, чтобы быть более понятным. - person luke; 28.10.2010