glMatrixMode (GL_MODELVIEW); Она определяет матрицу проекции модели 4 на 4 как текущую матрицу. Процедуры преобразований OpenGL, рассмотренные в предыдущем разделе, используются для модификации матрицы проекции модели, которая затем применяется для преобразования точек сцены. С помощью функции glMatrixMode можно задать еще два режима - текстурный и цветовой. Матрица текстуры используется для отображения текстурных узоров на поверхности, а матрица цветов - для перехода от одной модели цвета к другой. По умолчанию аргументом функции glMatrixMode является GL_MODELVIEW. Преобразования наблюдения, проектирования, наложения/изменения текстуры и цвета будут обсуждаться в следующих главах. Сейчас мы ограничим наше рассмотрение геометрическими преобразованиями.
После того как задан режим, при вызове процедуры преобразования генерируется матрица, которая множится на текущую матрицу выбранного режима. Кроме того, можно присваивать значения элементам текущей матрицы. В библиотеке OpenGL есть две необходимые для этого функции. При вывозе следующей функции в качестве текущей матрицы задается единичная.
glLoadldentity ( ); Кроме того, элементам текущей матрицы можно присвоить и другие значения, и для этого используется команда
glLoadMatrix* (elementsl6); Параметр elementsl6 задает 16-элементный массив с одним индексом, который содержит значения с плавающей запятой; для указания типа данных используется код-суффикс f или <± Элементы этого массива должны задаваться по столбцам. Следовательно, вначале перечисляются четыре элемента первого столбца, затем четыре элемента второго столбца, третьего столбца и наконец четвертого. Чтобы проиллюстрировать такое упорядочение, инициализируем матрицы проекции модели с помощью следующего кода.
glMatrixMode (GL_MODELVIEW);
GLfloat elems [16];
GLint k;
for (k = 0; k < 16; k++) elems [k] = float (k);
glLoadMatrixf (elems); Первое применяемое преобразование в этой последовательности является последним, заданным в коде. Следовательно, если последовательность преобразований задается в программе OpenGL, можно считать, что отдельные преобразования загружаются в стек, так что последняя заданная операция является первой, которая будет применена. В действительности ситуация несколько иная, но аналогия со стеком помогает запомнить, что в программе OpenGL последовательность преобразований применяется в порядке, противоположном тому, как она задавалась.
Важно также помнить, что в OpenGL матрицы записываются по столбцам. Кроме того, обращение к элементу матрицы в OpenGL является обращением к элементу в столбце j и строке к. Это отличается от стандартной математической договоренности, где сначала указывается строка. Впрочем, чтобы избежать ошибок, связанных со строками и столбцами, матрицы в OpenGL можно всегда задавать как 16-элементные массивы с одним индексом и помнить, что элементы матриц перечисляются по столбцам.
СТЕКИ МАТРИЦ В OpenGL
Для каждого из четырех режимов (проекции модели, проекции, текстуры и цвета), выбранных с помощью функции glMatrixMode, OpenGL поддерживает стек матриц. Изначально каждый стек содержит только единичную матрицу. В любой момент при обработке сцены верхняя матрица каждого стека называется текущей матрицей этого режима. После того как будут заданы преобразование наблюдения и геометрическое преобразование, сверху стека матриц модельной проекции располагается сложная матрица 4 на 4, объединяющая преобразования наблюдения и различные геометрические преобразования, которые нужно применить к сцене. В некоторых случаях может потребоваться создать несколько последовательностей проекций и преобразований, а затем для каждой из них записать сложную матрицу. Таким образом, OpenGL поддерживает стек матриц модельных проекций глубиной не менее 32, а в некоторых приложениях в стеке можно записывать более 32 матриц. Число позиций, доступных в стеке модельных проекций в конкретной реализации OpenGL, можно определить с помощью такого запроса.