М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 25
Текст из файла (страница 25)
Значение — 1.0 приводит к зеркальному отражению объекта отностительно оси. Прибегать к функции к15са!е*() рекомендуется только в случаях, когда это действительно ттеобходилто, так как она увеличивает затраты на обсчет освещения, ренормализуя векторы нормалей после преобразования. 112 Глава 3 ш Визуализация Рис. 3.7. Масштабирование и отражение объекта Пример кода модельного преобразования В листинге 3.2 приведена часть программы, рисующей четыре раза треугольник, как показано на рис.
З.Я. Осуществляются четыре преобразования треугольников: ° рисуется каркасный треугольник без преобразований; ° рисуется такой же треугольник, но линии каркаса штриховые и треугольник смен(ен (влево — в отрицательную сторону по оси х); ° треугольник рисуется штриховой линией с длинными штрихами, его высота (по оси у) убавлена на 50%, а ширина (по оси х) увеличена на 50%; ° рисуется повернутый треугольник с пунктирными границами.
модельного преобразования: гпобе(.с Листинг 3.2. Использование 811оап!пепт(Су(); 8(со)от)т(1.0, 1.0, 1.0>; Оган Сг(ап81е(): сплошная линия */ 81Епаьсе(ОС С1НЕ 5Т!РРСЕ); 81С(пе51(рр1е(1. ОхгвЕО); 81Соае1еепС(Су(); 81тгапэ1атет(-28.8, 0.0, 0 Оган Сг(ап81е(); /* штриховая линия '/ 0) 8!С(пе511рр1е(1, ОхгвОР); 81Соап1пепт(ту(); 815са1е1(1. 5, О. 5, 1. 8),' Оган Сг(ап81е(); /' длинные штрихи */ 811(пе51(рр1е(1, Ох8888): /* пунктирная линия "/ ПРИМЕЧАНИЕ Коэффициент масштабирования, равный нулю, влечет вырождение всех координат объекта в нуль. Это не очень хорошая идея, поскольку отменить действие операции невозможно. Говоря математически, матрицы не могут быть инвертированы, а инвертирование матриц требуется для операций освещения (см, главу 5).
Иногда свертывание координат имеет смысл. Одним из таких случаев является вычисление тени на плоской поверхности (см. раздел «Тени» главы 14). Вообще говоря, если система координат коллапсирует в нуль, матрица проекций должна использоваться раньше, чем модельно-видовая натрица. Модельно-видовые преобразования 113 Х)(азб)бент~ ту(); к)еотатет(эо,е, О.О, О,О, ).В); бган тг(апв1е[); З)Р(зза)е(6( Ь1НЕ 5Т1РРСЕ); Рмс. 3.8. Пример модельного преобразования ПРИМЕЧАНИЕ Иногда, когда программисты хотят заставить объект вращаться непрерывно, они пытаются зто сделать путем повторных использований матрицы поворота с небольшим шагом. Проблема этого способа в том, что из-за округления результат тысяч небольших вращений постепенно удаляется от теоретического (вплоть до остановки вращения).
Правильнее на каждом шаге увеличивать угол наклона и применять преобразование с этим значением. Помните, что использование функции 81Еоаб!()епС) )бу() предотвращает накопительный аффект от последуюп(их трансформаций. Многократное ее примене- 114 глава 3 ° визуализация ние может сказаться как положительно, так и отрицательно, например, если нужно накапливать результаты преобразований вида или модели. (См. раздел «Управление стеком матрип» для получения более подробной информации.) Пособие по преобразованиям от Нэйта Робинса Если вы уже вооружились набором учебных программ от Нэйта Робинса, пришло время запустить пособие по преобразованиям.
(См. раздел «Обучающие программы по ОрепС1 от Нэйта Робинса».) С помощью этого самоучителя вы можете экспериментировать с преобразованиями поворота, сдвига и масштабирования. Видовые преобразования Видовое преобразование изменяет положение и ориентацию точки обзора. Если обратиться к аналогии с фотокамерой, преобразование просмотра определяет положение штатива камеры и направление оптической оси объектива на модель. Так как происходит перемещение камеры в некоторую точку и поворот ее до тех пор, пока она не будет указывать в нужном направлении, видовое преобразование просмотра обычно реализуется перемещением и вращением.
Не забывайте, что для получения требуемого окончательного облика сцены в изображении или на фотографии можно передвигать либо камеру, либо все объекты сцены, но в противоположных направлениях. Таким образом, например, молельное преобразование, поворачивающее объекты против часовой стрелки, эквивалентно видовому преобразованшо, вращающему камеру по часовой стрелке. Наконец помните, что команды видового преобразования должны вызываться до любых модельных преобразований, изменяющих объекты первыми. Преобразования просмотра выполняются любым из способов, описанных ниже.
Кроме того, можно использовать значения по умолчанию лля положения и ориентации точки обзора, которые помещают ее в начало координат и направляют вдоль отрицательной оси к ° Посредством одной или нескольких команд модельного преобразования (таких как а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(С(х)онЫе еуех, СЕг)оцЫе вуеу, С(х)оиЫс еуег, СИоиЫе сел(вх, СИоиЫе септегу, СМооЫе сел(егх, СЫооЫе ирх, СМоиЫе и)пя СМоиЫе ирх); Определяет видовую матрицу и умножает ее на текушую матрицу.