М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 23
Текст из файла (страница 23)
(См. раздел «Модельно-видовые преобразования» для получеяия дополнительной информации.) Обратите внимание, что видовые п модельные преобразования включены в процедуру от вр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) — и его ширину и высоту в пикселах. Это объясняет, почему данную команду вызывают в функции гезпаре(): если окно меняет размеры, область просмотра также лолжна быть изменена.
Заметим, что часто ширина и высота приравниваются фактическим ширине и высоте вместо задания абсолютных разяеров. (См. одноименный раздел «Преобразование окна просмотраь.) Рисование сцены Как только все необходимые преобразования выполнены, вы можете рисовать сцену (это похоже на получение фотоснимка после нажатия кнопки).
Прорисовывая сцену, ОрепбБ преобразует каждую вершину каждого объекта посредстюм модельно-видовых преобразований. Затем каждая вершина преобразуется, хак определено проекцией, н отбрасывается, если она находится вне видимого объема, описанного преобразованием проекции. Наконец, прошедшие преобразования вершины разделязотся по параметру гв и отображаются в окно просмотра. 1оманды преобразования общего назначения В этом разделе обсуждаются некоторые команды Орел б(., которые будут вам полезны при реализации желаемых преобразований. Вы уже знакомы с двумя коиндами: д1нагг(хИоое() и И1ьоап1пеп1(су(). Четыре команды, описанные здесь, — В1ьоаоматг(х" (), к1еоаотгапзрозеиагг(х*о, к1ио11иагг(х'(), и х1Ми11Тгапзрозенагг1 х' () — позволяют вам определять вручную любую матрицу преобразований или умножать текущую матрицу на нужную.
Более специфичные команды преобразования — такие как к1оьоохА1() и к15са1е* () — описаны ниже. Как говорилось ранее, перед выполнением преобразования нужно обновить матрицу модели или проекции. Выбор матрицы осуществляется командой п1иаСг(хМоое(). При использовании списков команд ОрепО1, которые могут быть вызваны несколько раз, необходимо корректно сбрасывать матрицы. (Команда п1Магг! х нове () применима и для выбора матрицы текстур. Текстурирование обсуждается в разделе «Стек матриц текстур» главы 9.) то(п к1натг1хнопе(И ешпп тоде); Определяет, в какую из матриц вносятся изменения — модельно-видовую, проекционную или текстурную с помощью значения параметра тоде, равного 6е МООееч1еи, 6е РЙО! ест10м или 6е техтОме соответственно.
Последующие команды преобразования будут работать с указанной матрицей. Обратите внимание, что одновременно может изменяться только одна матрица. По умолчанию работа ведется с модельно-виловой матрицей, и для всех трех режимов матрицы единичные. 106 Глава 3 ° йизуализация Для подготовки текущей матрицы к преобразованиям необходимо выполнить ее перезагрузку командой ц1Ьоан1вепт!гу(). Как правило, эту команду вызыва- ют всегда перед проецированием или видовыми преобразованиями, но ее также можно вызывать и перед модельным преобразованием.
чоЫ ~1ьоа!)1оепт! ту(чоЫ); Устанавливает текущую 4 х 4 матрицу равной единичной. Если нужно использовать какую-то матрицу вместо текущей, используется функция й1(оавнагг!х*О или З1ЬоадТгаозрозенагг! х'(). Аналогично, функ- ция а1но1(на1г!х'О или а1Ми11ТгапзрозеМа(г!х*О применяется для умно- жения текущей матрицы на матрицу, принимаемую в аргументе.
чоЫ й11оабМатг(х[Щ(сопз( ТУРЕ 'т); Заполняет теку!дую матрицу 16 значениями, определяемыми аргументом и. чоЫ й1ни1(натг(х[Я)(сопз( ТУРЕ и); Умножает текущую матрицу на матрицу, определяемую аргументом т, и со- храняет результат в текущей матрице. Все умножения матриц в Орепб[ происходят следующим образом. Пусть есть две матрицы: текущая С и определенная с помощью команды к1Ми11натг! х'() или любой другой команды преобразований матриц матрица М. После умножения конечная матрица равна СМ. Так как операция матричного умножения не обладает свойством коммутативности, порядок множителей имеет значение. т1 т5 тч тп ииэит тЗ и7 то тн 4 В %7 т~6 М= Если вы программируете на С и объявляете матрицу как т [41[4], тогда в Ореп О(., где матрицы развернуты в памяти по столбцам, элемент т[!1[л находится на пересечении йго столбцауьи строки.