Сборка сцены
Рассмотрим небольшой пример, иллюстрирующий вышесказанное. Рис 4.2 представляет сцену, состоящую из трех похожих по форме домиков. Предположим, что у нас существует процедура, строящая домик в некоторой координатной системе. Середина окна домика располагается в начале координатной системы.
Добавлять объекты в сцену будем в соответствии с указанными на рисунке номерами координатных систем. Установим текущей матрицу модельно-видового преобразования, если это не сделано ранее: glMatrixMode(GL_MODELVIEW); Далее очистим буфер кадра и перейдем в мировую систему координат, загрузив в модельно-видовую матрицу единичную матрицу: glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity; Занесем текущее значение модельно-видовой матрицы в стек. Перед этим можно задать любые трансформации, которым будет подвергнута вся создаваемая сцена. glPushMatrix; Таким образом, мы запоминаем систему координат (SC), относительно которой будем строить сцену. Можно не использовать стек и строить сцену в мировых координатах. Но при этом процедура потеряет гибкость и трансформации, которым вы хотите подвергнуть всю сцену, придется определять для каждого ее элемента. Зададим преобразование переноса: glTranslatef(-size, 0, 0); Соответствующая ему матрица будет перемножена с текущей матрицей и результат заменит текущую модельно видовую матрицу. Можно сказать, что мы перешли из координатной системы сцены в координатную систему Н1. Она сдвинута в сторону отрицательной полуоси X, координатной системы сцены, на size единиц (ширина домика). Выполним процедуру, формирующую домик: DrawHouse; Переходя к построению второго и третьего домиков, обратим внимание на то, что они одинаково смещены относительно координатной системы сцены и имеют одинаковый размер. Извлечем из стека копию модельно-видовой матрицы, которая соответствует координатной системе сцены: glPopMatrix; Выполним перенос необходимый для перехода из SC в H2 и H3: glTranslatef(size, 0, 0); Таким образом, мы формируем матрицу представляющую некоторую промежуточную координатную систему, которую будем использовать для создания H2 и H3. Занесем копию этой матрицы в стек: glPushMatrix; Добавим перенос по оси ординат и масштабирование с коэффициентом меньшим единицы: glTranslatef(0, shift,0); glScalef(s,s,1);
В результате текущая матрица будет соответствовать координатной системе H2 и можно выполнять построение домика. DrawHouse; Извлечем из стека матрицу соответствующую промежуточной координатной системе: glPopMatrix; Добавим к ней перенос в сторону отрицательной полуоси ординат и поворот на 180 градусов: glTranslatef(0, shift,0); glScalef(s,s,1); glRotatef(-180,0,0,1); В результате мы получим координатную систему H3, в которой, выполним последний раз процедуру формирования домика: DrawHouse; Сцена сформирована, осталось только переключить буферы (если используется двойная буферизация): SwapglBuffers.
Заключение
В данной лекции мы рассмотрели основы работы с библиотекой OpenGL. Представили видовой конвейер как конечный автомат, работа которого определяется совокупностью переменных состояния. Разобрали синтаксис команд библиотеки и основные примитивы. Привели структуру простой программы и пример сборки сцены с использованием стека матриц библиотеки OpenGL/
|