М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 29
Текст из файла (страница 29)
Каж- дтя иэ этих матриц — фактически самый верхний элемент стека (набора) матриц (рис. 3.20). Стек модельно- видовых матриц (2 матрицы размером 4 х 4) Стек матриц проекций (2 матрицы размером 4 х 4) Рис. 3.20, Стек модельно-видовых матриц и матриц проекций 130 Глава 3 ° Визуализация Стек матриц облегчает создание иерархических моделей, в которых сложные объекты составляются из простых.
Допустим, вы рисуете автомобиль. У него есть четыре колеса, каждое из которых зафиксировано пятью болтами. В вашем распоряжении подпрограмма, рисующая обобшенное колесо, и подпрограмма, рисующая болт, так как все колеса н болты выглядят одинаково. Этн подпрограммы рисуют колесо или болт в некоторых заданных положениях и с конкретной ориентацией — например, центрированные в начале координат с осями, совпадающими с осью г. При рисовании колеспо-болтового автомобиля необходимо вызвать функпии рисования колес четыре раза с различными преобразованиями каждый раз, чтобы правильно расположить колеса.
Для каждого колеса нужно нарисовать пять болтов, каждый раз располагая их в соответствующем месте соответствуюшего диска. Предположим на минуту, что все необходимые действия — это нарисовать колеса и кузов машины. Применительно к русскому языку это звучит примерно так: «Рисуем кузов машины. Запоминаем положение и переходим к правому переднему колесу. Рисуем колесо и отменяем последний переход, то есть текушее положение возвращается в центр кузова. Запоминаем позицию и переходим к левому переднему колесу...» Точно так же для каждого колеса, если нужно нарисовать болт, запоминаем текушее положение и переходим к позиции каждого болта, отменяя преобразование после каждого рисования болта. Так как преобразования хранятся в матрицах, стек (набор) матриц представляет собой идеальный механизм для данных операций запоминания, перехода и отката.
Все матричные операции, описанные далее (В1(оабнатг1к(), б1(оас)ТгапэроэеИатг1к(), к1Иц11Иатгтх(), к1Мц1(ТгапэроэеМаггтх(), к1(.оаб1бепттгу() и команды создания специфичных матриц преобразований), связаны с текущей матрицей или с верхней матрицей стека. Управлять тем, какая матрица является верхней, можно с помощью команд управления стеком: к1РцэПИа(г1х (), которая помешает текущую матрицу на вершину стека, и к1РорИаг г1к (), которая отбрасывает верхнюю матрицу стека, как показано на рис.
3.21. (Как для любого стека, текущий элемент всегда находится на вершине стека.) По сути, команда к1РцэПМатг1к() означает «запомним текущее состояние», а команда к1РорИатг)х () — «вернемся к предыдущему состоянию». Копия матр До Рис. 3.21.
Работа со стеком матриц Управление стеком матриц 131 уоЫ к1Р05ЬМатгтх(уоЫ); Перемещает все матрицы в текусцем стеке матриц на один уровень вниз. Теку- щий стек матриц определяется с помощью команды В1Магсг(хмобе(). Верх- няя матрица копируется, то есть ее содержимое дублируется в верхней и вто- рой сверху матрице. Если матриц слишком много, генерируется ошибка. уоЫ В1Рорнатгтх(уоЫ); Удаляет верхнюсо матрицу из стека, уничтожая ее содержимое, Вторая сверху матрица становится верхней. Текущий стек определяется с помощью команды а1Матгтхиобе().
Ешти в стеке содержится единственная матрица, вызов функции а1рориатг(х() приводит к ошибке. Программа из листинга ЗА рисует автомобиль в последовательности кузон — ко- леса-болты. Листинг 3.4. Работа со стеком матриц бгаи ипее1 апб Ьо1(в() ( (пС (; бгаи иПЕЕ1(): (ОГ(1=0;т<5;тиа)( е(Ривлна(гсх(); 41аоСа(ет(22.9*1, 0.0, 0.0, 1.0); астгапвсасет().О, О.о, О.О); бган Ьо11(): а1РорнаСГ(х(); /' переходим к первому колесу "/ /' переходим ко второму колесу '/ Вэтом примере колеса и болты ориентированы вдоль оси д болты расположены через 72 и на расстоянии трех единиц (это могут быть дюймы) от центра колеса.
Передние колеса вынесены на 40 единиц вперед и на 30 единиц вправо и влево от вачача координат автомобиля. Стек более эффективен и удобен, чем одиночные матрицы, особенно когда ов поддерживается оборудованием. При помесцении матрицы в стек не нужно бгаи Ьобу апб ипее1 апб Ьо1Св() ( бгаи саг Ьобу(): а(РивПМатг1х(); астгапвса(ет(4О, Е, ЗО); бгаи илее1 апб ЬЬ1св(): 41РорМаСг(х(); 41РивПМатгсх(); 41тгапв1ате((40, О, -30), бгаи илее1 апб Ьо1(в(): 41РорнаСг!х(); /" так ме рисуем последиие два колеса '/ 132 Глава 3 ° Визуализация копировать текушие данные для возврата в основной процесс, а оборудование может одновременно копировать более одного элемента матрицы.
Иногда разумно хранить иа вершине стека единичную матрицу, благодаря чему отпадает потребность постоянно вызывать функцию к11оаб1бепС11у (). К в н Р Стек модельно-видовых матриц П в о Стек матриц проекций По матрице проекций выполняется преобразование проецирования, описываюшее видимый объем. Обычно ма~рицы проекций не объединяют, поэтому перел выполнением преобразований применяют функцию к1Соаб1бепс!суо. Также по этой причине глубина стека матриц проекций не превышает двух матриц. Некоторые реализации ОрепС! прелое~валяют возможность хранения в стеке более двух матриц размером 4 х 4. Для определения глубины стека используется функция я16ег1пгеяегч(61 ИАХ РЯОэЕСТ10И 5ТАСК ОЕРТН, С!1ПС "рагатт).
Одним из применений второй матрицы в стеке являются приложения, в которых нужно отображать справочное окно с текстом дополнительно к обычному окну с трехмерной сценой. Так как легче всего отображать текст в ортогональной проекции, можно сохранить текущую проекцию, установить ортогональную проекцию, отобразить текст и вернуться к исходной точке: Х1Иатг)хиоае161 РаОЗЕСТ1ОН); а1Риэьиасг1х(); l' сохраняем текущую проекцию'/ Х1Соаа1Оепт1ту(); а)Огтьо<...): /' устанавливаем лля отображения справки *Г О(яр1ау Спе Ье1р(); Х1Рорнатг)х(); октсетьте, что мы также не меняем модельно-видовую матрицу.
ггг:.И'~гстФАУ«Е Если вы немного знаете математику, вы можете создать собственную матрицу проекций, которая позволит выполнить нестандартное преобразование. Так, ни в Орепбс, ни в 6СЦ не встроен механизм для создания угловой перспективы. Если вы собираетесь эмулировать рисование чертежей, такая матрица вам пригодится.
К х1 О б1 Как вы уже видели ранее, в разделе «Модельно-видовые преобразования», молельно-видовая матрица содержит в себе данные от перемножения видовой и модельной матриц. Каждое видовое или модельное преобразование создает новую матрицу, которая перемножается с текущей модельно-видовой матрипей. Результат, который становится новой текушей матрицей, представляет собой композицию преобразований.
Модельно-видовой стек содержит 32 матрицы размером 4 х 4. Изначально верхняя матрица — единичная. Некоторые реализации ОрепС!. позволяют хранить в стеке более 32 матриц. Чтобы узнать, сколько матриц может уместиться в стеке, используйте команду я16е11псебегч(6С ИАХ ИООЕСЧ1ЕН 5ТАСК ОЕРТН, С1!пс 'рагатт). Дополнительные плоскости отсечения 133 Дополнительные плоскости отсечения Кроме шести плоскостей ограничения объема видимости (левой, правой, нижней, мрхней, ближней и дальней) можно задать дополнительные плоскости отсечеввя (как показано па рис. 3.22). Это позволяет давольно просто убирать постой)анне объекты из сцены — например, когда требуется отобразить разрез.
Квждая плоскость определяется коэффициентами ее уравнения: Ат + Ву е Сг + с) = О. Плоскости отсечения автоматически преобразуются соответственно молельно- видовым преобразованиям. результирующий объем есть пересечение видимого объема н всех полупространств, определенных дополнительными плоскостями отсечения. Напомним, что у многоугольников, подлежащих отсечению, Орепб(. автоматически пересчитывает вершины. Рис.
3.22. Дополнительные плоскости отсечения и объем видимости то!с( д161)рР1апе(С(.епшш рсале, сопзс 01с(опЫе 'ес)иабоп); Определяет плоскость отсечения. Указатель ес)иагсоп адресует тачки для четырех коэффициентов уравнения плоскости, Ах + Ву + Сг + Р = О. Все точки, заданные в координатах глаза (х„у„г„тг,), для которых выполняется выражение (А В С Р)М-с(х„У„гн чс,)т > О, лежат в полУпРостРанстве, опРеделенном плоскостью отсечения, где М вЂ” текущая модельно-видовая матрица. Все точки, не принадлежащие полупрострапству, определенному плоскостью отсечения, отсекаются.
Аргумент р1але принимает значения 6). С).1Р Р6АНЕП где (— целое число, обозначающее плоскость отсечения, в диапазоне от О до максиивльного числа плоскостей отсечения минус один. Кахдую плоскость отсечения предварительно нужно определить: вппаме161 611Р РСАИ61); Опсвюченне плоскости отсечения выполняется командой , 110!ваые161 СС1Р РСАНЕ1); 134 Глава 3 ° Визуализация Все реализации ОрепС].