М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 26
Текст из файла (страница 26)
Нужная точка обзора описывается значениями еуех, еуеу и еуег. Аргументы селгегх, селгегу и сепгегз определяют любую точку на линии взгляда, но обычно — некоторую точку в центре сцены. Параметры ирх, иру и ирг задают вектор ориентации (нр-нес(от) — направление от низа к верху основания пирамиды видимого объема. Применение функции я1оьооКА(() особенно полезно, когда, например, необходимо получить панораму пейзажа. При объеме видимости, симметричном в на- Модельно-видовые преобразования 117 правлениях х и у, точка с координатами (еуех, еуеу, еуег) всегда находится в центре сцены, поэтому серия команд с небольшими перемещениями этой точки даст, таким образом, панорамный вид. По умолчанию камера располагается в начале координат, смотрит вниз по оси з, а положительное направление оси у указывает вектор ориентации.
Это аналогично вызову функции 1<вьоохл<(Е.Е. Е,О, О.Е, Е.Е, Е.О, -1ЕЕ.Е, О.О. 1.Е, Е,Е1; Значение з для линии взгляда равно -100,0, но может быть любым отрицательным зна <ением г, так как линия взгляда останется такой же. Подобный вызов не имеет смысла, поскольку этн значения приняты по ум«лчанию (рис.
3.11). (Ливни, исходящие из камеры, определяют объем видимости, то есть поле зрейия.) Рис. 3.11. Положение камеры по умолчанию На рис. 3.12 изображен типичный результат использования функции а1ц ЬоокАт(). Положение камеры определяется точкой (4, 2, 1), Камера нацелена на модель, то есть координаты точки на линии взгляда равны (2, 4, -3). Вектор ориентации (2, 2, — 1) поворачивает точку наблюдения на 45'. ющий вектор камеры Рис. 3.12. Использование функции д<цьооМА1() 118 Глава 3 ° Визуализация Вызов, дающий такой резуль~ат, выглядит следующим образом: 81иьООКАт(4.8.
2.0, 1.8, 2.0. 4.0, -3.8, 2.8, 2.8, -1.8); Функция 810Еоохдт () является частью библиотеки С)Л), а не основной библиотеки ОрепС1. Это сделано не потому, что функция — не нужная, а потому, что она комбинированная — включает в себя несколько базовых функций ОрепС(., в частности 81тгапз1ате*О и 81йотате*О. Пусть камера находится в произвольной точке обзора и ориентирована согласно линии взгляда, определенной с помощью функции 81цсоокдт (), а сцена расположена в начале координат.
Для отмены действия 81цсооКА(О нужно переместить камеру в начало координат и позиционировать ее вдоль отрицательного направления оси г в положение по умолчанию. Просто перенесем камеру в начало координат. Легко представить серию поворотов вокруг каждой из трех осей неподвижной системы координат, которые позволят ориентировать камеру вдоль отрицательного направления оси г.
Так как ОрепС1 позволяет делать вращение вокруг любой нз осей, можно крутить камеру как угодно с помощью одного только вызова команды 8180 тате" () . ПРИМЕЧАНИЕ За один раз можно осуществить только одно видовое преобразование. Нельзя объединять результаты двух преобразований, как и камера не устанавливается на двух штативах сразу. Если требуется изменить положение камеры, вызовите предварительно функцию 8юоаб!депбтуО, чтобы предупредить воздействие любых текущих преобразований просмотра. Пособие по проецированию от Нэйта Робинса Если у вас есть набор программ от Нзйта Робинса, запустите пособие по проецированию. В атом пособии показано применение 81цЕооКАт О с различными значениями аргументов.
ПРИМЕЧАНИЕ Для преобразования произвольного вектора таким образом, чтобы он совпадал с другим произвольным вектором (например, с отрицательной осью т), нужно провести несколько математических операций. Ось, вокруг которой производится вращение, иожно получить с помощью векторного произведения двух нормализованных векторов. Для определения угла поворота оба образующих вектора сначала нормализуются. Косинус искомого угла между двумя векторами равен скалярному произведению нормализованных векторов.
Угол вращения вокруг оси, определяемый векторным произведением, всегда принимает значения от 0' до 180'. (О нахождении векторного и скалярного произведений см. приложение Д.) Вычисление угла между двумя нормализованными векторами через арккосинус их скалярного произведения не очень точно, особенно для малых углов, но достаточно для начала работы. Создание собственных функций В некоторых специализированных приложениях может потребоваться определить собственные функции преобразования.
Так как зто делается достаточно редко и зто достаточно специализировано, оставим данный вопрос большей частью на самостоятельное рассмотрение читателя. Следующие задания предлагают реализацию двух преобразований просмотра, которые могут пригодиться. Преобразования проецирования 119 Упражнение Допустим, пишется авиасимулятор и нужно отобразить мир глазами пилота из кабины самолета. Мир описывается координатной системой с началом на взлетно-посадочной полосе и координатами самолета (х, у, г).
Как полагается, у самолета есть крен, наклон самолета к его поперечной оси и линия курса (это углы поворота самолета относительно центра тяжести). Следующая подпрограмма осуществляет необходимые видовые преобразования: чо!б р!1оСЧ!еи(6(бапые р1апех, 6ьбапЫе р1апеу, 6(боиЫе р1апес, 6(бппые гп(1, 6(боиЫе р!ссп, 6(босые Пеаб!пв) ( Хщпгатеб(гп(1, О.О, О.О, 1.8); Всао(атеб(р!Сев, 8.0, 1.О, О.О); д(ао(агеб(ьеаб(па, 1.0, 0,8, 0.0); х1тгапх(асеб(-р1апех, -р1апеу, -р)апет) ) Предположим, приложение имитирует камеру, вращающуюся по орбите вокруг обьекта, расположенного в начале координат. В этом случае видовое преобразование можно определить в полярной системе координат.
Пусть переменная г(мтансе !ахает радиус орбиты или расстояние от камеры до начала координат. (Изначально камера смещена на агсг(апсе единиц вдоль положительного направления оси г.) Параметр азстигг) описывает угол поворота камеры вокруг объекта в плоскости зу, отмеренный относительно положительной полуоси у. Также существует паракетр е(епайоп, который указывает угол поворота камеры в плоскости уг, относительно положительного направления оси к Наконец, параметр гср)з( обозначает арашение объема видимости вокруг линии взгляда. Следующая подпрограмма производит предложенные преобразования: чоы рп1агЧ!еи(6(бопЫе б!з(апсе, 6(бобЫе Свист, 6(бопЫе е(еча(зоп, 6ыббЫе ас!ипСП) ( 81тгапз1а(еб(8.8, 0.0, -б!х(апсе); х(апсасеб(-сихзс, 8,0, О.о, 1.0); а(ао(агеб(-е1ечаС!оп, 1.0, 0.8, 8.0); 81ао(аСеб(ас!поСП, 8.0, 0.0, 1.0); Преобразования проецирования В предыдуШих разделах рассматривалось, как получить желаемую модельно-видовую матрипу для проведения правильных модельных и видовых преобразоваавй.
Данный раздел объясняет, как определить желаемую матрицу проекций, которая также изменяет вершины объектов сцены. Перед использованием любых преобразований, описанных здесь, не забудьте выполнить команды: 11яа(ю х небе (6С ряо! 8СТ(оя); 11(паб1бепС! Су(); 120 Глава 3 ° Визуализация Они применяют все преобразования к матрице проекций и позволяют не затрагивать модельно-видовую матрицу, соответственно, удается избежать смешивания преобразований, которое может появиться потому, что каждая команда преобразования проекций отвечает за отде,тьное преобразование. Цель преобразования проецирования — определить объем видимости, используемый в лвух случаях.
Объем видимости устанавливает, как объект отображается на экран (посредством перспективного или ортогонального проецирования), и определяет, какие объекты илн части объектов отсекаются в окончательном изображении. Вы можете представить, что точка обзора находится в одном конце видимого обьема. Возможно, будет полезно перечитать раздел «Пример: рисование куба» на предмет преобразований, включая преобразование проекции. Перспективное проецирование Наиболее очевидная характеристика перспективной проекции — ракурс ((огезйогсепшя) в смысле сокрашения размеров находяшихся далыпе от камеры объектов. Видимый объем в перспективной проекции представляет собой усеченную пирамиду (вершпна которой срезана плоскостью, параллельной основанию). Объекты, попадающие в объем видимости, проецируются к вершине пирамиды, где находится камера или точка обзора, и те из них, что расположены ближе к точке обзора, выглядят больше, чем объекты, находящиеся ближе к основанию пирамиды.
Этот метод используется в основном для анимации, визуального моделирования и в приложениях, где необходимо лобиться определенной степени реализма, так как его работа схожа с работой глаза (или камеры). Команда к)Е газ спи О, определявшая усеченную пирамиду, вычисляет матрицу перспективной проекции и перемножает ее с текушей матрицей (обычно единичной). Напоминаем, что объем видимости предназначен для отсечения всех объектов, лежаших вне его.
Четыре грани пирамиды, ее вершина и основание определяются шестью плоскостями отсечения объема вссдссмости, как показано на рис. 3.13. Объекты или пх части, находящиеся вне этих плоскостей, отсекаются в окончательном изображении. Функция к)ггвзгвпо не требует, чтобы видимый объем был симметричным. тосд я)Р гозсвпс(СИопЫе (е(г, Сссс)опЫе пцйг, Сс.с)оцЫе Ьопот, СИопЫе гор, С) сссгпЫе пеаг, С1 сйшЫе/аг); Создае~ матрицу для усеченной пирамиды и умножает на нее текущую матрицу. Обьем видимости в виде усеченной пирамиды определяется аргументами в следуюшем порядке: (1е/г, Ьоггот, -пеаг) и (пй)сг, гор -пваг) задают координаты (х; у, г) левос.о нижнего и правого верхнего углов ближней плоскости отсечения соответственно; а пеаг и ~аг уточняют расстояние от точки обзора до ближней и дальней плоскостей отсечения. Они должны быть положительными.