glGetlntegerv (GL_MAX_MODELVIEW_STACK_DEPTH, stackSize); В результате в массив stackSize возвращается искомое целочисленное значение. Другие три режима имеют минимальную глубину стека 2, а максимальная глубина конкретной реализации определяется с помощью одной из следующих символьных констант OpenGL: GL_MAX_PROJECTION_STACK_DEPTH, GL_MAX_TEXTURE_STACK_DEPTH или GL__MAX_COLOR_STACK_DEPTH.

Кроме того, можно определить, сколько матриц в настоящий момент находится в стеке:

glGetlntegerv (GL_MODELVIEW_STACK_DEPTH, numMats); Изначально стек модельных проекций содержит только единичную матрицу, так что если выдать указанный запрос до начала работы со стеком, будет возвращено значение “1”. Подобные символьные константы существуют и для определения числа матриц, находящихся в настоящий момент в трех других стеках.

В OpenGL есть две функции работы с матрицами, находящимися в стеке. Использование данных функций обработки стеков эффективнее работы с матрицами стека по отдельности, особенно если стековые функции реализованы аппаратно. Например, аппаратная реализация может копировать несколько элементов матрицы одновременно. Кроме того, в стеке можно хранить единичную матрицу, чтобы инициализацию текущей матрицы можно было выполнить быстрее, чем с помощью повторяющихся вызовов функции glLoadldentity.

Итак, используя приведенную ниже функцию, можно копировать текущую матрицу в верхнюю позицию активного стека и сохранить ее копию во второй позиции стека.

glPushMatrix ( ); В результате получаются одинаковые матрицы в двух верхних позициях стека. Другой стековой функцией является

glPopMatrix ( ); Эта команда уничтожает матрицу в верхней позиции стека, и текущей матрицей становится вторая матрица стека. Чтобы “вытолкнуть” (pop) вершину стека, в нем должно находиться не менее двух матриц. В противном случае будет получена ошибка.

Трансляция прямоугольника с использованием функции OpenGL glTranslatef (-200.0, -50.0, 0.0)

Рис. 5.55. Трансляция прямоугольника с использованием функции OpenGL glTranslatef (-200.0, -50.0, 0.0)

Поворот прямоугольника вокруг оси z с использованием функции OpenGL glRotatef (90.0, 0.0, 0.0, 1.0)

Рис. 5.56. Поворот прямоугольника вокруг оси z с использованием функции OpenGL glRotatef (90.0, 0.0, 0.0, 1.0)

ПРИМЕР ПРОГРАММИРОВАНИЯ ГЕОМЕТРИЧЕСКИХ ПРЕОБРАЗОВАНИЙ В OpenGL

В приведенном ниже фрагменте кода к прямоугольнику последовательно применяются базовые геометрические преобразования. Изначально матрица модельной проекции - единичная, и на экране изображен синий прямоугольник. Затем текущий цвет меняется на красный, задаются параметры двухмерной трансляции, и отображается красный транслированный прямоугольник (рис. 5.55). Поскольку мы не хотим объединять преобразования, далее текущая матрица устанавливается равной единичной. Затем строится матрица поворота, и выполняется ее свертка с текущей матрицей (единичная). Потом мы обращаемся к исходному прямоугольнику, и он поворачивается вокруг оси z и отображается красным цветом (рис. 5.56). Данный процесс повторяется еще раз для получения масштабированного и отраженного красного прямоугольника, показанного на рис. 5.57.

Масштабирование и отражение прямоугольника с использованием функции OpenGL glScalef (-0.5, 1.0, 1.0)

Рис. 5.57. Масштабирование и отражение прямоугольника с использованием функции OpenGL glScalef (-0.5, 1.0, 1.0)


⇐ вернуться назад | | далее ⇒