КГ_5глава (Компьютерная графика), страница 2
Описание файла
Файл "КГ_5глава" внутри архива находится в папке "Компьютерная графика". Документ из архива "Компьютерная графика", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 4 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "компьютерная графика" в общих файлах.
Онлайн просмотр документа "КГ_5глава"
Текст 2 страницы из документа "КГ_5глава"
В приведенных выше примерах использовался точечный источник освещения, расположенный так же, как и камера— на оси Z видовых координат, Как получить изображение шара, освещенного сбоку?
Рассмотрим для простоты диффузное рассеивание. Для расчета косинуса угла наклона нормали по отношению к направлению луча источника света! удобно ввести еще одну систему координат. Эта система координат — обозначим ее как (Хс, Yc, Zc) — повернута в пространстве таким образом, чтобы источник света располагался на оси Zc. Здесь следует уточнить, что мы рассматриваем точечный источник света, расположенный снаружи шара на достаточно большом расстоянии, причем не учитываем зависимость освещенности точек поверхности от расстояния до источника света.
Ориентацию системы координат источника света (Хс, Yc, Zc) можно задать двумя углами поворота (at, Д) — подобно тому, как задается видовая система координат. На рис. 5.7 показано расположение осей.
Ориентация осей координат
| Рис. 5.7. Пример взаимного расположения осей мировых координат (х, у, z), видовых
I координат (X, У, Z) — (а = -18°, уЗ= 71°) и системы координат, связанной с источником
освещения (Хс, Ус, Zc) — (<%= 51°, &= 48°)
Косинус угла нормали можно вычислить по формуле
где Zc — координата точки поверхности в системе координат источника света. Необходимо учесть, что нулевые и отрицательные значения косинуса соответствуют неосвещенным точкам поверхности.
Таким образом, для рисования поверхности с учетом произвольной ориентации источника света необходимо определять еще и значение координаты Zc. В остальном алгоритм рисования шара полностью аналогичен уже рассмотренным алгоритмам.
Градиентное закрашивание круга
В предыдущем разделе мы пытались изобразить гладкую поверхность шара путем рисования многогранника с достаточно сложным закрашиванием полигонов отдельных граней. А нельзя ли рисовать шар как-нибудь попроще?
Если рассматривать общий контур шара— то это линия круга. Остается лишь каким-то образом закрасить внутренности круга, чтобы цвет пиксели более или менее соответствовал бы изображению объемного объекта. Нужно закрашивать так, чтобы цвет пикселов внутри круга плавно изменялся бы в соответствии с освещенностью поверхности шара. Для этого можно использовать градиентное закрашивание.
Для простоты будем полагать, что источник света расположен позади нас В этом случае можно использовать радиальное градиентное закрашивание -наиболее яркие точки расположены в центре, яркость остальных точек убывает пропорционально расстоянию до центра круга.
Вашему вниманию предлагается следующий алгоритм закрашивания.
В этом алгоритме использована симметрия шара, освещенного указанным образом. Поэтому вычисления производятся только для точек одного октанта круга. Для определения цвета пикселов вычисляется значение (к), которое равно квадрату косинуса угла нормали по отношению к оси 2 видовых координат.
Во второй части этой книги мы рассмотрим примеры программ, в которых использован данный алгоритм градиентного закрашивания.
Проанализируем алгоритм и попробуем оптимизировать его по быстродействию. В первую очередь отметим, что в данном алгоритме вычисляется квадрат косинуса нормали именно из соображений повышения быстродействия— для вычисления косинуса в первой степени необходимо вычислять квадратный корень из (к). Далее заметим, что во внутреннем цикле присутствуют операции деления и умножения. Как от них избавиться? Вначале рассмотрим вычисление величины r2 = х2+у2. Поскольку во внутреннем цикле изменяется у, то рассмотрим r2 как функцию от у. Обозначим ее как r2(у), и найдем разность значений этой функции для соседних шагов цикла:
Поскольку r2(у+1) = r2(у) + ∆'(у+1), то можно организовать вычисление г2 в цикле по у следующим образом:
Умножение на 2 компьютер может выполнять как сдвиг двоичного числа, что несколько быстрее обычного умножения. Попробуем еще улучшить цикл. Для этого рассмотрим разности второго порядка:
То, что вторая разность является константой, не зависящей от у, можно использовать для построения цикла, в теле которого присутствуют только операции сложения. Перестроим цикл следующим образом.
Можно применить этот разностный метод (известный в математической литературе для организации итерационных вычислений) также и для вычисления величины к = 1 - r2/R2. Вы можете это сделать в качестве упражнения.
Необходимо отметить, что подобная оптимизация может не дать существенного ускорения графического вывода, если время вычисления величин r2 и к мало по сравнению с другими операциями. Так, например, в первую очередь необходимо обеспечивать быструю запись в память пикселов растра отображения. Хорошие возможности для ускорения тут дает симметрия круга по октантам.
Кроме иллюстрации возможностей ускорения, модифицированный алгоритм здесь приведен еще с одной целью. Оказывается, если заменить операцию (dr2 = dr2 + 2) на (dr2 = dr2 + D), где D является константой для всего цикла рисования, то можно получить довольно любопытные вариации формы круга. На рис. 5.8 приведена форма фигур, соответствующих некоторым значениям D.
Рис. 5.8. Фигуры, получаемые при различных значениях D
Значение константы D может быть и дробным — форма фигуры плавно изменяется в зависимости от D.
Наложение текстуры на шар
До сих пор мы с вами рассматривали одноцветный шар. Однако, возможно, требуется построить изображение шара, раскрашенного более сложным образом. Часто бывает необходимо имитировать различные материалы, сложную структуру поверхности — например, пористую, с трещинами и тому подобное. Для этого могут быть использованы текстуры. Изображение текстуры как бы накладывается на поверхность объекта.
Давайте построим изображение поверхности шара, на который как резиновая оболочка "натянута" текстура — карта мира.
Из картографии известны многие способы изображения Земли в соответствии с различными проекциями. Выберем вертикальную цилиндрическую равнопромежуточную проекцию шара, для которой наиболее просто пересчитываются координаты — из угловых координат (широты, долготы) в пикселные координаты текстуры (хТ, уТ) и обратно (рис. 5.9).
i Рис. 5.9. Соотношение угловых координат поверхности шара
I и пикселных координат растрового прямоугольника текстуры
На рис. 5.10 приведен один из возможных вариантов карты мира в цилиндрической равнопромежуточной проекции.
Рис. 5.10. Пример текстуры — карта мира
Как использовать текстуру для построения требуемого изображения шара? Это можно сделать несколькими способами. Разнообразие вариантов обуславливается, в том числе, и способом описания поверхности шара.
Рассмотрим вначале вариант, основывающийся на аналитической форме описания шара. Будем использовать формулу, связывающую координаты каждой точки поверхности шара в виде
Построение растрового изображения шара в аксонометрической проекции представим как двумерный цикл перебора всех пикселов квадрата, охватывающего круг на плоскости проецирования. При этом для каждого пиксела вначале пересчитываются координаты проекции в мировые координаты, а далее — в координаты точки в текстуре.
Рассмотрим данный алгоритм подробнее. Для простоты будем использовать аксонометрическую проекцию, которая строится как поворот исходной (мировой) системы координат (х, у, z) на углы а и β соответствующие положению камеры наблюдения. Поскольку в обеих системах координат— как в исходной (х, у, z), так и в повернутой системе (X, Y, Z) — для шара сохраняется равенство суммы квадратов координат квадрату его радиуса, то можно найти Z по известным двум координатам Х и Yследующим образом:
Поскольку мы строим изображение для передней стороны шара, то нужно брать значение Z со знаком "+". Вычисление координаты Z является ключевым моментом рассматриваемого алгоритма. Это достаточно уникальный случай простого определения трехмерных координат точек объекта по двумерным координатам проекции.
Далее, координаты точки (х, у, z) можно вычислить, выполнив обратный поворот координат (X, Y, Z). Например, если считать, что плоскость проецирования повернута вокруг оси х на угол β то
Поворот камеры вокруг оси z (по долготе на угол а) мы учтем позже.
Преобразование координат (х, у, z) в широту и долготу (B, L) можно выполнить по формулам:
Теперь можно учесть поворот камеры по долготе:
Приведенные выше формулы справедливы для случая, когда центр координат плоскости проецирования совпадает с точкой (0, 0) основного растра. При построении изображения в окне необходимо еще вычислять экранные координаты, что можно сделать путем масштабирования и сдвига осей координат.
По известным значениям широты (В) и долготы (L) определяем координаты точки в растре текстуры. Как уже указывалось выше, для текстуры в виде вертикальной равнопромежуточной цилиндрической проекции шара пересчет координат выполняется простейшим образом:
где а, Ь, с и d — константы, определяемые размерами растра текстуры. На рис. 5.11 показаны несколько текстурированных изображений поверхности шара.
Рис. 5.11. Примеры использования текстуры для шара
Данный способ построения текстурированного изображения имеет свои достоинства и недостатки. Положительной чертой способа можно считать высокую точность отображения — точность определяется разрешением растров текстуры и основного растра. Погрешность вычисления координат по формулам преобразований здесь незначительна при использовании стандартной разрядности чисел с плавающей точкой.