OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 25
Текст из файла (страница 25)
Пара/пельный перенос сдвигает объект и его систему координат вниз по оси х. Затем объект поворачивается относительно начала координат (несмещенного), нс меняя своего расгголожения на оси. Зтот вариант годится для приложений наподобие сочлененной руки робота: в плече, локте, запястьях и на каждом пальпе. Чтобы оценить, как кончики пальцы переместятся относительно тела, предпочтительно начать вращение и смещение с плеча и опускаться вниз в порядке перечисления. Обратное представление является более запутанным.
Второй подход бывает более сложным, особенно при наличии масштабирования, и тем более когда оно неоднородно, то есть коэффициенты для различных осей разные. После неоднородного масштабирования сдвиг перемещает вершины с учетом множителя от предыдущего преобразования, так как система координат сжата нли растянута. Такое масп(табирование, смешанное с вращением, может привести к тому, что оси системы координат потеряют перпендикулярность. Как упоминалось ранее, обычно в коде команды видового преобразования предшествуют командам модельных преобразований. В этом случае вершины модели сначала получают требуемую ориентацию, и затем срабатывают преобразования вида. Видовые команды должны идти первыми, поскольку умножение матрип задается в обратном порядке.
Однако не обязательно определять какие-либо молельно-видовые преобразования, если достаточно действий по умолчанию. Когда 110 Глава 3 ° Визуализация преобразования вида пе определены, «камера» находится в начале координат, «смотрит» вдоль оси г в минус бесконечность. Если не заданы явно модельные преобразования, модель не перемещается и сохраняет свои положение, ориентацию и размер. Так как команды модельных преобразований могут использоваться вместо видовых преобразований, они пригшмаются е рассмотрение первыми несмотря на то, что команды видовых преобразований в действительности выдаются раньше.
Программисты при составлении кода должны отталкиваться от этого постулата. Часто сначала пишут весь код, необходимый для композиции сцены, включая позиционирование и ориентирование объектов друг относительно друга. Затем определяется местоположение точки наблюдения, связанной со всей сценой, и добавляется код для соответствующих преобразований просмотра.
Модельные преобразования В Орепо(. определены три команды модельных преобразований; я1Тгап з1аге* (), я1яотаге* () и 515са1е" (), Эти три функции трансформируют объект (или систему координат, если думать об изменении системы координат, а не объекта) посредством сдвига, врашения и масштабирования. Результат эквивалентен мультиплицированию матриц преобразования, вращения или масштабирования с последуюшим вызовом команды я1И>11Иагг1х»О, принимаюшей полученную матрицу в качестве аргумента.
Однако означенные команды дают результат быстрее, чем к1Ии11Иат г)х* О. Ореп('ь автоматически вычисляет нужные матрицы за вас. (См. приложение Е для получения более подробной информации.) Каждое умножение матриц можно описать в терлшнах операций над вершинами геометрического объекта в фиксированной системе координат или в терминах операций над локальной системой координат, связанной с объектом. Перемещение гоЯ я1Тгапз1ате(Я)(ТУРЕ х, ТУРЕ у, ТУРЕ г)' Перемножает текущую матрицу и матрицу, которая перемешает объект с помощью значений х, у и г (или сдвигает локальную систему координат на те же значения). Рисунок 3.5 показывает результат использования команды я1Тгапз1ате«О.
Вращение чоЯ к1когате(Я)(ТУРЕ апц1е, ТУРЕ х, ТУРЕ у, ТУРЕ г); Перемножает текущую матрицу и матрицу, врашаюшую объект (или локальную систему координат) против часовой стрелки вокруг луча из начала координат в точку (х, у, г). Аргумент апфе определяет угол поворота (в градусах). Результат работы функции В1 Рога те г (45, О; О, О; 6, О: 1, 9), поворачиваюшей объект вокруг оси г на 45', показан на рис.
3.6. Модельно-видовые преобразования 111 Рис. 3.5. Перемещение объекта Рис. З.б. Вращение объекта Поинттте, что объект, располагающийся дальше от оси вращения, будет повернут больше (имеет большую орбиту вратцения), чем объект, находящийся недалеко от оси вращения. Если значение аргумента аль)е равно нулю, команда а1иотате*() ничего не делает. МОСШтабИРОВаНИЕ еоЫ В15са1е(Ы)(ТУРЕх, ТУРЕу, ТУРЕг); Умножает текутцую матрицу на матрицу, определяющую растяжение, сжатие пли зеркальное отражение объекта относительно осей. Каждая координата х, у и г каждой точки обьекта умножается на соответствующее значение х, у или г.
Если рассматривать операцию с точки зрения локальной системы координат, на те же значения растягиваются, сжимаются нли отражаются оси локальной системы координат, и, соответственно, трансформирустся связанный с ними объект. Рисунок З.7 демонстрирует результат выполнения команды 515са1ет(г.в: -0,5: 1,Е) . Функция а15са1е* () выполняет три преобразования, изменяющих размеры видимого объекта: масштабирование со значением больше 1.0 растягивает объект, а значение меньше 1.0 уменьшает его. Значение — 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 от Нэйта Робинса».) С помощью этого самоучителя вы можете экспериментировать с преобразованиями поворота, сдвига и масштабирования.
Видовые преобразования Видовое преобразование изменяет положение и ориентацию точки обзора. Если обратиться к аналогии с фотокамерой, преобразование просмотра определяет положение штатива камеры и направление оптической оси объектива на модель. Так как происходит перемещение камеры в некоторую точку и поворот ее до тех пор, пока она не будет указывать в нужном направлении, видовое преобразование просмотра обычно реализуется перемещением и вращением. Не забывайте, что для получения требуемого окончательного облика сцены в изображении или на фотографии можно передвигать либо камеру, либо все объекты сцены, но в противоположных направлениях. Таким образом, например, молельное преобразование, поворачивающее объекты против часовой стрелки, эквивалентно видовому преобразованшо, вращающему камеру по часовой стрелке.