Введение в OpenGL | страница 10
Для определения элементов матрицы текущего типа вызывается команда
>void glLoadMatrix[f d](GLtype *m)
где m указывает на массив из 16 элементов типа float или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй, третий и четвертый.
Команда
>void glLoadIdentity(void)
заменяет текущую матрицу на единичную. Часто нужно сохранить содержимое текущей матрицы для дальнейшего использования, для чего используют команды
>void glPushMatrix(void)
>void glPopMatrix(void)
Они записывают и восстанавливают текущую матрицу из стека, причем для каждого типа матриц стек свой. Для видовых матриц его глубина равна как минимум 32, а для двух оставшихся типов как минимум 2.
Для умножения текущей матрицы слева на другую матрицу используется команда
>void glMultMatrix[f d](GLtype *m)
где m должен задавать матрицу размером 4x4 в виде массива с описанным расположением данных. Однако обычно для изменения матрицы того или иного типа удобно использовать специальные команды, которые по значениям своих параметров создают нужную матрицу и перемножают ее с текущей. Чтобы сделать текущей созданную матрицу, надо перед вызовом этой команды вызвать glLoadIdentity().
В целом, для отображения трехмерных объектов сцены в окно приложения используется следующая последовательность действий:
Координаты объекта → Видовые координаты → Усеченные координаты → Нормализованные координаты → Оконные координаты
Рассмотрим каждое из этих преобразований отдельно.
Видовое преобразование
К видовым преобразованиям будем относить перенос, поворот и изменение масштаба вдоль координатных осей. Для проведения этих операций достаточно умножить на соответствующую матрицу каждую вершину объекта и получить измененные координаты этой вершины:
(x’, y’, z’, 1)>T = M * (x, y, z, 1)>T
где M матрица видового преобразования. Перспективное преобразование и проектирование производится аналогично. Сама матрица может быть создана с помощью следующих команд:
>void glTranslate[f d](GLtype x, GLtype y, GLtype z)
>void glRotate[f d](GLtype angle, GLtype x, GLtype y, GLtype z)
>void glScale[f d](GLtype x, GLtype y, GLtype z)
glTranlsate…() производит перенос объекта, прибавляя к координатам его вершин значения своих параметров.
glRotate…() производит поворот объекта против часовой стрелки на угол angle (измеряется в градусах) вокруг вектора (x,y,z).
glScale…() производит масштабирование объекта (сжатие или растяжение), домножая соответствующие координаты его вершин на значения своих параметров.