Я пытался понять урок 9 из учебника NEHE, который о растровых изображениях, перемещаемых в трехмерном пространстве.
Самое интересное здесь — это перемещать 2d-текстуру растрового изображения на простом квадре через 3d-пространство и постоянно держать ее лицом к экрану (зрителю). Таким образом, растровое изображение выглядит трехмерным, но все время обращено к зрителю в двухмерном, независимо от того, где оно находится в трехмерном пространстве.
В уроке 9 генерируется список звезд, движущихся по кругу, что выглядит очень красиво. Чтобы не видеть звезду сбоку, кодер применяет хитрое кодирование, чтобы звезда все время была обращена к зрителю.
код для этого выглядит следующим образом: (следующий код вызывается для каждой звезды в цикле)
glLoadIdentity();
glTranslatef(0.0f,0.0f,zoom);
glRotatef(tilt,1.0f,0.0f,0.0f);
glRotatef(star[loop].angle,0.0f,1.0f,0.0f);
glTranslatef(star[loop].dist,0.0f,0.0f);
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);
glRotatef(-tilt,1.0f,0.0f,0.0f);
После строк выше начинается рисование звезды. Если вы проверите последние две строки, вы увидите, что преобразования из строк 3 и 4 просто отменены (например, отмена). Эти две строчки в конце дают нам возможность все время показывать звезду лицом к зрителю. Но я не знаю, почему это работает.
И я думаю, что это происходит из-за моего непонимания того, как OpenGL действительно выполняет преобразования. Для меня последние две строки — это просто отмена того, что было сделано раньше, что для меня не имеет смысла. Но это работает.
Поэтому, когда я вызываю glTranslatef, я знаю, что текущая матрица представления умножается на значения перевода, предоставленные с помощью glTranslatef. Другими словами, "glTranslatef(0.0f,0.0f,zoom);" переместит место, где я собираюсь нарисовать свои звезды, если масштаб будет отрицательным. В ПОРЯДКЕ.
а ЧТО именно здесь перенесено? Зритель перемещается «от себя» или есть какая-то система координат объекта, которая перемещается в сцену с помощью glTranslatef? Что тут происходит?
Тогда glRotatef, что здесь повернуто? Опять система координат, сам зритель?
В реальном мире. Я бы поместил звезду где-нибудь в трехмерном пространстве, затем повернул бы ее в мировом пространстве вокруг начала координат моего мира, затем сделал бы движение, когда звезда движется к началу координат и снова начинает с края, затем я бы сделал вращение для сама звезда, поэтому она обращена к зрителю. И я думаю, что это сделано здесь. Но как мне вращаться сначала вокруг начала миров, а затем вокруг самой звезды? для меня это выглядит так, как будто opengl переключается между мировой системой координат и системой координат объекта, чего на самом деле не происходит, как вы видите.
Мне не нужно добавлять остальную часть кода, потому что он довольно стандартный. Простая инициализация GL для 3D-рисунков, вращающихся вещей, а затем простое рисование QUADS со звездной текстурой с использованием смешивания. Вот и все.
Может ли кто-нибудь объяснить, что я здесь недопонимаю?