Я пытался понять урок 9 из учебника NEHE, в котором речь идет о перемещении растровых изображений в трехмерном пространстве.
самое интересное здесь - это перемещать 2-мерную растровую текстуру по простому четырехугольнику через трехмерное пространство и постоянно держать его лицом к экрану (зрителю). Таким образом, растровое изображение выглядит трехмерным, но все время находится на 2d лицом к зрителю, независимо от того, где оно находится в трехмерном пространстве.
В уроке 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);" переместил бы место, где я собираюсь нарисовать мои звезды на сцене, если масштаб будет отрицательным. OK.
но ЧТО именно здесь перемещается? Зритель перемещен "прочь" или есть какая-то система координат объекта, которая перемещается в сцену с помощью glTranslatef? Что здесь происходит?
Тогда glRotatef, что здесь вращается? Опять система координат, сам зритель?
В реальном мире. Я поместил бы звезду где-нибудь в трехмерном пространстве, затем повернул ее в мировом пространстве вокруг моего источника миров, затем сделал бы движение, поскольку звезда движется к началу и снова начинается на краю, затем я сделал бы поворот для сама звезда, так что его лицом к зрителю. И я думаю, это сделано здесь. Но как мне вращаться сначала вокруг происхождения миров, а затем вокруг самой звезды? для меня похоже, что opengl переключается между мировой системой координат и системой координат объекта, что на самом деле не происходит, как вы видите.
Мне не нужно добавлять остальную часть кода, потому что он довольно стандартный. Простая инициализация GL для трехмерных чертежей, вращающихся объектов, а затем простой чертеж QUADS с текстурой звезды с использованием смешивания. Вот и все.
Может ли кто-нибудь объяснить, что я здесь недопонимаю?