OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 26
Текст из файла (страница 26)
Наконец помните, что команды видового преобразования должны вызываться до любых модельных преобразований, изменяющих объекты первыми. Преобразования просмотра выполняются любым из способов, описанных ниже. Кроме того, можно использовать значения по умолчанию лля положения и ориентации точки обзора, которые помещают ее в начало координат и направляют вдоль отрицательной оси к ° Посредством одной или нескольких команд модельного преобразования (таких как а1Тгапз1аге*() и й1йогате»()). Результат можно представить как изменение положения камеры или всех объектов в сцене относительно неподвижной камеры.
° Для опрелеления линии взгляда можно использовать команду библиотеки о1л) ~1и(.сока((). эта команда включает в себя набор команд вращения и перемещения. ° Создать свою собственную команду, включающую вращения и сдвиг. В некоторых приложениях может потребоваться команда, позволяющая удобно и быстро определять специфичное видовое преобразование. Например, можно определить углы крена, тангажа и курса самолета в полете или описать преобразование в терминах полярной системы координат для камеры, вращающейся вокруг объекта по определенной орбите. Модельно-видовые преобразования 115 Функции 9!Тгап5!а~е и д!Ко~а~е Эмулируя преобразования просмотра командами модельного преобразования, мы пытаемся переместить позицию наблюдения в нужном направлении, оставляя объекты неподвижными. Так как точка обзора и объекты по умолчанию располагаются в начале координат (рис.
3.9), необходимо провести некоторую подготовку, чтобы объект был видим. Заметьте, что, как показано на рисунке, камера по умолчани|о смотрит вниз по оси а (Вы видите заднюю часть камеры.) Рис. Злк Объект и точка просмотра в на~але координат В самом простом случае можно отодвинуть наблюдателя назад от объектов; это даст такой же эффект, что п перемещение объектов вперед от точки обзора. Помните, что по умолчанию «перед» находится в отрицательном направлении оси г; если вращается точка обзора, «перед» имеет другое значение, Таким образом, для отдаления точки обзора на пять единиц от объектов, как показано на рис.
3.10, используется следующая команда: кгтгалзтатет<в,в; о,е; -з,в~; Эта команла перемещает объекты в сцене на — 5 единиц вдоль оси г, что эквивалентно смешению камеры на +5 единиц вдоль оси г, 7 Рис. 3.10. Разделение точки просмотра и объекта Предположим, что вы хотите взглянуть на объекты со стороны. Когда нужно использовать команду вращения, до или после команды переноса? Если думать 116 Глава 3 ° Визуализация в терминах фиксированной системы координат, для начала надо представить объект и камеру в нуле системы координат. Сперва поворачиваем объект, а затем удаляем его от камеры так, чтобы была видна нужная сторона.
В фиксированной системе координат команды должны вызываться в обратном порядке относительно оказываемого эффекта, то есть сначала записываем команду сдвига, а затем— команду вращения. Теперь представим локальную систему координат. В этом случае при исполнении перемещение объекта и его локальной системы координат от начала координат предшествует врагцению и команды записываются в том же порялке. Последовательность команд трансформации для получения требуемого результата следующая: Х(тгале(аее((О.В, О.а, -З.О); Х)алеете((ЭВ.О. О.О, 1.В, О.О); Если возникают проблемы с результатом от перемножения матриц, попробуйте обе системы координат — фиксированную и локальную — для определения, какой результат вам больше подходит. Напомним, что в фиксированной системе координат вращение всегда происходит относительно ее начала координат, а в локальной — вокруг нуля локальных координат.
Как запасной вариант есть еще функция к1иЬооКЯ((), описанная ниже. Функция дП.оо~А1 Часто программисты строят сцену вокруг начала координат или какой-то другой подходяшей точки, а затем смотрят на нее из точки, дающей требуемый вид сцены. Как следует из ее имени, функция я1о(ооКА(() предназначена для определения точки наблюдения. Она получает три набора аргументов, определяющих положение точки обзора, направление камеры и вектор ориентации. Выберите требуемую точку обзора, дающую нужный вид сцены.
Точка, определяющая направление взгляда, будет где-то в центре сцены. (Если сцена строилась в начале координат, этой точкой обычно является начало координат.) Определение вектора ориентации является немного более сложным. Если строится сцена реального мира в начале или вокруг начала координат, то положительное направление оси у даст требуемый вектор для функции к1о1ооКА(() .
Однако если разрабатывается симулятор полета, данный вектор перпендикулярен крыльям самолета и направлен от самолета в небо, когда самолет находится на земле. чо(с) к1осооКА1(С(х)онЫе еуех, СЕг)оцЫе вуеу, С(х)оиЫс еуег, СИоиЫе сел(вх, СИоиЫе септегу, СМооЫе сел(егх, СЫооЫе ирх, СМоиЫе и)пя СМоиЫе ирх); Определяет видовую матрицу и умножает ее на текушую матрицу. Нужная точка обзора описывается значениями еуех, еуеу и еуег. Аргументы селгегх, селгегу и сепгегз определяют любую точку на линии взгляда, но обычно — некоторую точку в центре сцены.
Параметры ирх, иру и ирг задают вектор ориентации (нр-нес(от) — направление от низа к верху основания пирамиды видимого объема. Применение функции я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 Упражнение Допустим, пишется авиасимулятор и нужно отобразить мир глазами пилота из кабины самолета. Мир описывается координатной системой с началом на взлетно-посадочной полосе и координатами самолета (х, у, г).