OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 23
Текст из файла (страница 23)
Это позволяет в конце процесса преобразования с помощью значений г правильно передать глубину (удаленне от экрана). Одно из применений глубины — устранение ненужных прорисовок. Предположим, что существуют дне вершины с одинаковыми координатами х и у, по с различными координатами г. Исходя из этой информации, Ореном решает, какая из поверхностей закрывается другой, что помогает избежать прорисовок скрытых поверхностей, (См. главы 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всоохяг(). Вы уже догадались, почему? Потому, что здесь вместо перемещения самой камеры (видовое преобразование), позволяющего захватить куб в объектив, мы подвинули куб относительно камеры (модельное преобразование). Эта двойственность объясняет, почему видовое я модельное преобразования обьединяют в модельпо-видовую ягатрицу перед тем, яак их выпошшть. (См. раздел «Модельно-видовые преобразования» для получеяия дополнительной информации.) Обратите внимание, что видовые п модельные преобразования включены в процедуру от вр1ау() вместе с прорисовкой куба В1игки геСобе(). Это удобно тем, что если, например, окно перемещается или масштабируется, о1яр1ау() при повторной прорисовке содержимого окна выполняет все нужные преобразования, что, гарантирует правильное отображение куба.
Повторное использование процедуры гн яр1ау() подчеркивает необходимость загрузки единичной матрипы перед выполнением видовых и модельных преобразований, особенно если между вызовами процедуры о г вр1ау () могли быть проведены другие преобразования. Проекционное преобразование Определение преобразования проекпии похоже на выбор объектива для фотоаппарата. Это преобразование можно считать определением поля зрения или видимого объема и, соответственно, указанием, какие объекты будут видимы и как оян будут выглядеть.
Это похоже на выбор между широкоугольным, обычным яли телескопическим объективом. С широкоугольным объективом вы можете сделать более широкий кадр, чем с телескопическим, но последний позволяет приблизить удаленные объекты. При использовании компьютерной графики вам яе нужно платить 10 000 долларов за 2000-миллиметровый телескопический объектив, достаточно задать меньшее значение для поля зрения. 104 Глава 3 ° Визуализация Дополнительно проекционное преобразование определяет, каким образом объекты проецируются на экран.
В ОрепОВ определены два основных типа проекций с наборами соответствующих команд. Первая — перспективная проекция; которая не то чтобы заглядывает в будущее, а позволяет видеть веши так, как мы привыкли в обычной жизни. Перспектива заставляет удаленные объекты казаться меньшими по размеру, чем близкие; например, она «вынуждает» сходиться железнодорожные рельсы. Если вам нужно создать реалистичное изображение, вам стоит выбрать перспективную проекцию, которая определяется в листинге 3.1 с помощью команды я1е ге з г иа () .
Другим видом проекции является ортогональпия, которая отображает объекты на экране без воздействия па их размеры. Ортогональная проекция используется в приложениях архитектурного и машинного дизайна, где нужно передать размеры объектов, а не их внешний вид. Архитекторы пользуются перспективой, чтобы показать, как детали зданий или внутреннее пространство выглядят с той или иной точки зрения. Потребность в ортогональной проекции появляется при подготовке точных чертежей, которые используются при конструировании зданий. (См.
раадел «Преобразования проецирования».) Перед вызовом к1Р1озгоаО следует сделать ряд подготовительных операций. Как показано в процедуре гез паре () (листинг 3 1), первой выполняется команда к1Маг г!хиосе О со значение»1 аргумента 6( РЙО) ЕСТ10М. Это указывает, что текушая матрица определяет проекционное преобразование и что последующие преобразования работают с матрицей проек((ий. Как вы вилите, несколькими строками ниже снова вызгявается ц1Мах11хМосеО со значением аргумента 6Е М00Е (1(1ЕИ. Это означает, что все последующие преобразования затрагивают матрицу виловых преобразований, а не матрицу проекций. (См.
раздел «Управление стеком матриц».) Обратите внимание, что функция Е1ьоас1пепг)гу() используется для инициализации текущей матрицы проекции — для того, чтобы действовало только проекционное преобразование. Теперь можно вызвать я1Р1цвтиа() собственно для преобразования.
В данцол~ примере (листинг 3.1) преобразования проекции и окна просмотра объединены в процедуре ге з паре (), которая вызывается при создании окна на экране и всякий раз при его перемещении или изменении размера. Это разумно, поскольку как проецирование, так и вписывание в окно просмотра, — операции, связанные непосредственно с визуализацией и зависят от размеров окна па экране и соотношения его сторон. Упражнение Замените к1Е1озговО в листинге 3.1 на подобную ОШ-функцию я1оРегзресс1че () со значениями аргументов (60,0; 1,0; 1,5; 20,0). Затем поэкспериментируйте с различными величинами, особенно для параметров уопу и ах)эесг. Преобразование окна просмотра В совокупности преобразования проекции и окна просмотра определяют, как сцена отображается на экран компьютера.
Первое задает механизм отображения, Команды преобразования общего назначения 105 а окно просмотра отвечает за форму доступного экранного пространства, и, в аналогии с камерой, за размеры и местоположение фотографии — например, должна пн она быть увеличена или уменыпена. Аргументы функции к1Н( еиро г1() определяют начало координат доступного экранного пространства — в данном привере (О, 0) — и его ширину и высоту в пикселах. Это объясняет, почему данную команду вызывают в функции гезпаре(): если окно меняет размеры, область просмотра также лолжна быть изменена. Заметим, что часто ширина и высота приравниваются фактическим ширине и высоте вместо задания абсолютных разяеров. (См.
одноименный раздел «Преобразование окна просмотраь.) Рисование сцены Как только все необходимые преобразования выполнены, вы можете рисовать сцену (это похоже на получение фотоснимка после нажатия кнопки). Прорисовывая сцену, ОрепбБ преобразует каждую вершину каждого объекта посредстюм модельно-видовых преобразований. Затем каждая вершина преобразуется, хак определено проекцией, н отбрасывается, если она находится вне видимого объема, описанного преобразованием проекции.