2.5 Видовые трансформации Видовое преобразование изменяет позицию и ориентацию точки обзора. Модельное преобразование, поворачивающее объекты сцены против часовой стрелки аналогично видовому преобразованию, которое поворачивает камеру по часовой стрелке.
OpenGl позволяет производить видовые преобразования несколькими способами.
Использование одной или нескольких команд модельных преобразований (glTranslate*() или glRotate*()). Можно представить эффект этих преобразований как перемещении камеры, или как перемещение всех объектов сцены относительно стационарной камеры.
Использование команды библиотеки утилит gluLookAt() для определения точки и направления обзора. Эта команда инкапсулирует в себе серию поворотов и переносов.
Создание своей собственной функции, инкапсулирующей повороты и переносы. В некоторых случаях такая функция может понадобиться для того, чтобы можно было задавать видовую трансформацию каким-либо специфическим путем. Например, для определения преобразования в терминах полярных координат для камеры, вращающейся вокруг объекта или в терминах углов наклона самолета в полете.
Команда gluLookAt().
Часто программисты конструируют сцену в районе начала координат или в некотором другом месте, а затем хотят посмотреть на нее с определенной точки обзора для получения лучшего вида. Команда из библиотеки утилит gluLookAt() разработана как раз для подобных целей. Она принимает три набора аргументов, которые задают точку наблюдения, прицельную точку (точку, на которую направлена камера) и направление, которое следует считать верхним. Прицельная точка, как правило, находится где-то в середине сцены. Несколько сложнее задать верный вектор верхнего направления. Например, для трехмерного симулятора полетов, верхним является направление перпендикулярное крыльям самолета. void gluLookAt (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);
Функция задает видовую матрицу и умножает на нее текущую матрицу. Выбранная точка обзора задается аргументами eyex, eyey и eyez. Аргументы centerx, centery и centerz задают любую точку на линии обзора, но обычно они задают точку где-то в середине обозреваемой сцены. Аргументы upz, upyи upz определяют, какое направление считается верхним (то есть направление от дна до вершины объема видимости). По умолчанию камера находится в начале координат, направлена вдоль отрицательного направления оси z, а вектор верхнего направления совпадает с положительным направлением оси y.
GluLookAt() является частью библиотеки утилит, а не базовой командой OpenGL. Это произошло не потому, что gluLookAt() бесполезна, а потому, что она инкапсулирует несколько базовых команд OpenGL, а именно glTranslate*() и glRotate*(). Чтобы отменить действия gluLookAt(), необходимо поместить камеру в начало координат и установить направление обзора совпадающим с отрицательным направлением оси z (то есть привести видовое преобразование к ситуации по умолчанию).
2.6 Списки отображения Список отображения (display list) —список команд или список вывода — это группа команд OpenGL, сохраненных для последующего выполнения. Когда список отображения вызывается на выполнение, команды обрабатываются в порядке их появления в списке. Большинство команд OpenGL может сохраняться в списке или обрабатываться в режиме непосредственного выполнения.
Списки отображения позволяют улучшить производительность за счет использования запомненных для последующего выполнения команд OpenGL. Максимум отдачи дает кэширование команд в списке, если вы планируете перерисовывать один и тот же объект несколько раз или существует набор изменяемых состояний, которые нужно воспроизводить многократно. С помощью списков отображения можно определить геометрию и/или изменяемое состояние однажды и повторить их столько раз, сколько нужно.
Случай, когда список отображения используется для единичного запоминания, можно проиллюстрировать на примере рисования трехколесного велосипеда. Его два задних колеса имеют одинаковый размер, но требуют отдельной прорисовки, так как смещены друг относительно друга. Переднее колесо больше по диаметру и также находится в индивидуальной позиции. Эффективный способ передать вращение колес заключается в запоминании геометрии одного колеса в списке отображения и последующем трехкратном вызове этого списка. Необходимо построить соответствующую модельно-видовую матрицу перед каждым вызовом списка для вычисления корректных размеров и положения каждого колеса.
С целью поднятия производительности команды списков отображения OpenGL кэшируются, причем так, что однажды созданный список отображения не может быть модифицирован. В противном случае выигрыш в производительности был бы сведен к минимуму за счет поиска по списку и лишних операций управления памятью. Если бы части списка отображения были изменяемыми, распределение и высвобождение памяти привело бы к дефрагментации памяти. Любые модификации, внесенные реализацией OpenGL в порядок команд списка отображения с целью повышения эффективности рендеринга, все равно потребовали бы отката.
Вместе с тем имеются некоторые издержки, обусловленные процессом перехода к списку отображения. Если такой список невелик, эти издержки способны свести на нет все преимущества списочной организации. Наиболее предпочтительные места для оптимизации перечислены ниже:
Матричные операции. Большинство матричных операций требуют вычисления обратных матриц. В зависимости от реализации OpenGL, обе матрицы — расчетная и обратная — сохраняются или не сохраняются в списке отображения.
Растровые двоичные карты и изображения. При компиляции списка отображения OpenGL может преобразовать данные в представление, предпочтительное для оборудования. Это оказывает существенный эффект на скорость рисования растровых символов, поскольку символьные строки обычно состоят из совокупности небольших образов (двоичных карт).
Источники света, свойства материала и модели распространения света. Когда отрисовывается сцена со сложными условиями освещения, можно изменять материалы для каждого элемента сцены. Задание материалов само по себе медленная операция, поскольку оно предполагает множество вычислений. Если возможно поместить описание свойств материалов в список отображения, эти вычисления не будут выполняться всякий раз при переключении между материалами, так как сохранению подлежат лишь результаты вычислений; в итоге рендеринг освещенной сцены может ускориться.
|