М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 22
Текст из файла (страница 22)
В трехмерной компьютерной графике отсечение происходит путем отбрасывания объектов, находящихся за плоскостью отсечения. В конечном итоге должно быть установлено соответствие между преобразованными координатами и пиксслами на экране. Этот процесс называют преобразованием окна просмотра (ч1еп рогг). . Перечисленные операции и методы управления ими описываются в следующих асновных разделах данной главы: 98 Глава 3 ° Визуализация ° Обзор: аналогия с камерой. Дает представление о процессе преобразования через аналогию с процессом фотографирования. В этом разделе представлен простой пример программы, которая преобразует объект, н кратко описываются основные команды преобразований в ОрепС!..
° Команды преобразования общего назначения. ° Модельно-видовые преобразования. Подробно объясняет, как определить и представить результат модельно-видовых преобразований. Эти преобразования устанавливают взаимное расположение модели и камеры для получения желаемого результата. ° Преобразования проецирования. Описывает, как задать форму и расположение видимого обьежа (ч1еччпя чо1шпе). Видимый объем определяется согласно тому, как сцена проецируется на экран (в перспективной или ортогональной проекции) и какие выступающие за этот объем части объектов отсекаются. ° Преобразование окна просмотра.
Рассказывает, как контролировать преобразование координат трехмерной модели в координаты на экране. ° Проблемы преобразований. Дает несколько советов, как поступить в случае, если вы нс можете получить желаемый эффект при моделировании, просмотре, проецировании объектов и вписывании их в окно просмотра. ь Управление стеком матриц. Обсуждает, как сохранить и восстановить какие- либо преобразования. Это особенно полезно, когда вы рисуете сложные объекты, состоящие из более простых элементов. ° Дополнительные плоскости отсечения. Описывает, как определить дополнительные плоскости отсечения, кроме определенных видимым объемом.
° Примеры объединения нескольких преобразований. Продемонстрирует вам несколько более сложное использование преобразований. ° Изучив раздел «Обратные, или имитационные, преобразования», вы узнаете, как из оконных координат точки получить первоначальные координаты объекта. Само преобразование (без инверсии) также может быть эмулировано. Дополнительно в ОрепС1.
версии 1.3 были добавлены новые функции для поддержки развертывания матриц по строкам, а не по столбцам (транспонирования, в терминах ОрепС1.). Обзор: аналогия с камерой Процесс преобразования, подготавливающий изображение желаемой сцены, сходен с фотографированием. Как показано на рис. 3.1, шаги при работе с фотокамерой (или компьютером) могут быть следующими: 1. Установить штатив и направить камеру на сцену (видовое преобразование).
2. Подготовить фотографпруемую сцену в нужной композиции (модельное преобразование). Обзор: аналогия с камерой 99 3. Подобрать объектив или отрегулировать масштабирование (преобразование проекции). 4. Определиться с размером конечной фотографии, например, вы можете захо- теть ее увеличить (впнсывание в окно просмотра). После того как все этапы выполнены, изображение может быть зафиксировано кли сцена нарисована. Фотокамера Компьютер Рис.
3.1. Аналогия с камерой 100 Глава 3 ° Визуализация Обратите внимание, что эти шаги соответствуют последовательности, в которой вы определяете необходимые преобразования в вашей программе, а не обязательно в последовательности, в которой над вершинами объектов выполняются важные математические операции. Видовые преобразования должны предшествовать модельным в коде, но можно определить проекцию и видовое преобразование в любой точке перед началом рисования. Рисунок 3.2 показывает порядок, в котором эти операции происходят на вашем компьютере. Оконныа координаты Рнс. 3.2, Стадии преобразования вершин Чтобы определить видовое, модельное и проекционное преобразования, мы создадим матрицу М размерности 4 н 4, которая затем будет умножаться на координаты каждой вершины ч в сцене для осуществления преобразования: и' =Мы (Помните, что вершины уже имеют четыре координаты (х, у, г, ш), хотя в большинстве случаев ге = 1, а для двухмерных данных г - О.) Обратите внимание, что видовое и модельное преобразования автоматически применяются к векторам нормали к поверхности, дополнительно к координатам вершин.
(Векторы нормали используются только в системе координат наблюдателя.) Это гарантирует правильное соотношение вектора нормали и данных вершин. Определенные нами видовое и модельное преобразования формируют матрицу модели, которая применяется к входным координатам обьекта для получения выходных координат в системе наблюдения. Затем срабатывают, если такие определены, дополнительные плоскости отсечения с целью удаления некоторых объектов из сцены или для показа объекта в разрезе. После этого ОрепС). применяет матрицу проекции лля получения усеченных координагл.
Это преобразование определяет видимый объем; объекты вне его отсекаются и не попадают в финальную сцену. Затем выполняется деление по перспективе путем деления значений координат на ге для получения нормализованных Обзор: аналогия с камерой 101 координат устройства.
(См, приложение Е для получения дополнительной информации о значении т-координаты и ее влиянии на матричные преобразования.) Наконец, преобразоваш<ые координаття переводятся в оконные координаты в ходе преобразования окна просмотра. Изображение при этом сжимается или растягивается.
Можно предположить, что координат х и у достаточно для определения точек, отображаемых на экране. Однако все преооразовання выполняются также и над координатой г. Это позволяет в конце процесса преобразования с помощью значений г правильно передать глубину (удаленне от экрана). Одно из применений глубины — устранение ненужных прорисовок. Предположим, что существуют дне вершины с одинаковыми координатами х и у, по с различными координатами г. Исходя из этой информации, Ореном решает, какая из поверхностей закрывается другой, что помогает избежать прорисовок скрытых поверхностей, (См.
главы 5 и (О для получения дополнительной информации об этой технологии, называемой удаление невидимых поверхностен.) Для более полного понимания текущей главы вам необходимо знание действий с матрицами. Если вы хотите пополнить свои знания в этой области, можете взять любой учебник по линейной алгебре. Пример: рисование куба Программа из листинге 3.! рисует куб, масштабируемый модельным преобразованием (рис. 3.3). Видовое преобразование к1и сооклс() позиционирует камеру и направляет ее туда, где рисуется куб.
Также определяются преобразования проекции и окна просмотра. Оставшуюся часть этого раздела занимает рассмотрение листинга 3.! и краткое объяснение использования команл преобразования. Поскедующие разделы содержат полное, детальное обсуждение всех команд преобрззования Орепо!., Листинг 3.1. Трансформированный куб: сиЬе.с чо(б (п!1(чо!П) ( К)С)евсее(вг(О.О, О.О. О.О, О.О>; К15ьабенобе1(ОС ГСАТ); ) че(В б(зр1ау(чазб) ( К(С)евг(ОС СО(Он Вбрр(а В(т>! К>Се)рг>((1.В, 1.О, 1.О>; 51соэа1бепт!1уо; /* очищаем матрицу '/ /" видовое преобразование К)ч(вва/(1(О.О, О.О, 5.О, В,О, О.О, О.О, О.О, ).О, О.О>; К15са1е((1.В, 2.0, 1.0); /* модельное преобразование '/ К(ч(Н(гееиЬе(1.В>; К(Г)вен(); продолжвнов р 102 Глава 3 ° Визуализация Листинг 3.1 (продолжение) чо!б геьларе(!пС и, !пС П) ( 91Н!еирпгС(0, О, (6[5!се!) и, (6Сэ)се!) П); 91Матг)хМобе(6С РЙО)ЕСТ10М); 91Соаб1бепС(Су(); 91Ргиэтпм(-1.9.
1.0, - 1.9, 1.9, 1.5, 20.9)! 91Матг)хМобе(6С МООЕСН1Ей); ) (пс ма!и(!пс агзс, спаг*' агзч) ( 91НС1п(С(аагзс, агзч); 9[ос)п)св)эр)аумобе(6сет 51нбсе [ 6сцт абв); 91иС!п!Сй!пбои5!се(599, 500)'! 91ч(1п!Сй(пбоиРоэ)С!оп(199, 100); 91иСЕгеасей!пбои(агах[9]); !пчс(); 91иСО(эр1аугчпс(б(эр1ау); 9[п(аеэьарегипс(геэнаре): 91итна!пьоор(); гесчгп 0; Рис. З.З. Трансформированный куб Видовое преобразование Вспомним, что видовое преобразование аналогично размешепию и нацеливанию фотоаппарата.
В приведенном примере кода перед определением видового преобразования текугцая матрица устанавливается в единичную с помощью функции 91соаб1бепс! су(). Это необхолимо, так как большинство команд преобразования умножают текущую матрицу на некоторую другую, а затем делают результирусошусо матрицу текушей. Без загрузки единичной матрицы вы будете накладывать полученный результат на результат предыдущей операции преобразования. В некоторых случаях такие наложения необходимы, но в основном матрица должна сбрасываться.
В листинге 3.1 после того, как матрица инициализирована, осуществляется видовое преобразование функцией 91исооКАС () . Аргументы этой функции определяют положение камеры (или взгляда), ее направление и угол наклона. Используемые в примере значения помещают камеру в точку пространства с координатами (О, О, 5), направляют осггическую систему на позицию (О, О, 0) и задают вектор ориентации (О, 1, 0) — направление от низа к верху основания пирамиды видимого объема.
Обзор: аналогия с камерой 103 Если функция я1псоохдг() не вызывается, действуют значения по умолчанию; то есть камера расположена в начале координат, указывает вниз вдоль оси я я имеет вектор ориентации (О, 1, О). В листинге 3.1 с помощью функции я1я(оохдг() камера перемешается на пять единиц по оси к (См. Раздел «Модельно-видовые преобразования» для получения дополнительной информации.) Модельное преобразование Модельное преобразование применяется для позиционирования модели и залаяяя ее орнснтации.
Например, вы можете повернуть, переместить или масштабировать модель — или реализовать некоторую комбинациго зтих операций. В листянге 3.1 для таких целей используется функция а15са1ет(). Ее аргументы апределяют, как осуществляется масштабирование по трем осям. Если все аргуиенты равны 1,0, она не имеет смысла. В результате работы программы куб растянут вдвое по оси у. Таким образом, если один из углов куба до цреобразоваиия взходился в точке (3.0, 3.0, 3.0), то после него угол переместился в точку (3.0, 6.0, 3.0).
В результате мы получим не куб, а прямоугольный параллелепипед, В качестве упражнения замените в листинге 3.1 команду я1оьооКАГ() на функцию я1тгаля1асе() с аргументами (0.0, 0.0, -5.0). Результат будет такой же, как я при использовании я1всоохяг(). Вы уже догадались, почему? Потому, что здесь вместо перемещения самой камеры (видовое преобразование), позволяющего захватить куб в объектив, мы подвинули куб относительно камеры (модельное преобразование). Эта двойственность объясняет, почему видовое я модельное преобразования обьединяют в модельпо-видовую ягатрицу перед тем, яак их выпошшть.