Закраска Фонга требует больших вычислительных затрат, однако она позволяет разрешить многие проблемы метода Гуро. При закраске Гуро вдоль сканирующей строки интерполируется значение интенсивности, а при закраске Фонга - вектор нормали. Затем он используется в модели освещения для вычисления интенсивности пикселя. При этом достигается лучшая локальная аппроксимация кривизны поверхности и, следовательно, получается более реалистическое изображение. В частности, правдоподобнее выглядят зеркальные блики.
При закраске Фонга аппроксимация кривизны поверхности производится сначала в вершинах многоугольников путем аппроксимации нормали в вершине (см. главу 3.3). После этого билинейной интерполяцией вычисляется нормаль в каждом пикселе. Например, снова обращаясь к рис. 3.17, получаем нормаль в Q линейной интерполяцией между А и В, в R - между В и С и, наконец, в Р - между Q и R. Таким образом:
(3.56)
(3.57)
(3.58)
где
u=AQ / AB, w=BR / BC, t=QP / QR (3.59)
Нормаль вдоль сканирующей строки опять можно выразить через приращение, т. е.
(3.60)
где индексы 1 и 2 указывают на расположение пикселов на строке.
Хотя метод Фонга устраняет большинство недостатков метода Гуро, он тоже основывается на линейной интерполяции. Поэтому в местах разрыва первой производной интенсивности заметен эффект полос Маха, хотя и не такой сильный, как при закраске Гуро. Однако, иногда этот эффект проявляется сильнее у метода Фонга, например, для сфер. Кроме того, оба метода могут привести к ошибкам при изображении невыпуклых многоугольников, например, таких, как на рис. 3.17. Первая сканирующая строка использует данные из вершин QRS, а вторая, лежащая ниже, берет также данные вершины Р. Это может нарушить непрерывность закраски.
Рис. 3.17 - Нарушение непрерывности закраски для невыпуклого
многоугольника
Также возникают трудности, когда любой из этих методов применяется при создании последовательности кинокадров. Например, закраска может значительно изменяться от кадра к кадру. Это происходит из-за того, что правило закраски зависит от поворотов, а обработка ведется в пространстве изображения. Поэтому, когда от кадра к кадру меняется ориентация объекта, его закраска (цвет) тоже изменяется, причем достаточно заметно.
3.9 Яркость и освещенность
Одним из факторов формирования изображения является яркость конкретной его точки. Термин «яркость» употребляется для обозначения двух разных понятий: яркость изображения и яркость сцены.
Яркость связана с потоком энергии, которая может быть измерена разными способами. Вместо яркости изображения вводят новый термин: освещенность изображения – это мощность световой энергии, падающей на единицу поверхности.
, (3.61)
где - мощность потока, – бесконечно малый участок поверхности.
При рассмотрении сцены яркость связана с потоком энергии, излучаемым поверхностью. Для замены неформального понятия “яркость сцены” вводится термин “энергетическая яркость поверхности”. Она равна мощности энергии, излучаемой единицей площади поверхности внутри единичного телесного угла, не зависит от угла наблюдения, свойств поверхности и энергии падающего потока света.
3.10 Отсечение
Для определения пересечения отрезка с окном пересечения, необходимо знать как минимум следующее:
§ две точки отрезка – его начало и конец (Т1 и Т2);
§ последовательность вершин окна, в том порядке, в каком они составляют контур окна.
Здесь рассматриваются три алгоритма, которые использовались в процедуре отсечения:
Алгоритм обнаружения тривиальности отрезка.
Алгоритм отсечения для выпуклого окна.
Алгоритм отсечения для произвольного окна.
Рассмотрим эти алгоритмы по порядку.
На рис.3.18 показана плоская сцена и отсекающее окно регулярной формы. Окно задается левым, правым, верхним и нижним двумерными ребрами.
Рис. 3.18 – Двумерное отсекающее окно
Отрезок считается тривиально видимым (для произвольного окна), если его концевые точки Т1 и Т2 находятся внутри окна.
Отрезок тривиально невидим, если выполняется хотя бы одно из условий:
§ Координаты Y у точек Т1 и Т2 лежат выше самой верхней координаты окна по Y.
§ Координаты Y у точек Т1 и Т2 лежат ниже самой нижней координаты окна по Y.
§ Координаты X у точек Т1 и Т2 лежат левее самой левой координаты окна по X.
§ Координаты X у точек Т1 и Т2 лежат правее самой правой координаты окна по X.
Рассмотрим теперь алгоритм отсечения для выпуклого окна. Для этого нам необходимо ввести понятие пересечения двух отрезков.
Из линейной алгебры можно получить уравнение линии по двум точкам. Приравнивая полученные уравнения отрезков 1 и 2, и решая систему, получаем точку пересечения двух линий, если она есть. Затем, анализируя результат, узнаем, принадлежит ли эта точка пересечения отрезку 1 и отрезку 2? Если да, то найденная точка и есть точка пересечения двух отрезков, иначе отрезки не пересекаются.
Введем алгоритм (´), с помощью которого можно определить лежит ли точка внутри выпуклого окна.
Пусть все точки окна упорядочены по направлению обхода. Т.е. сторона окна является направленным вектором.
Тогда, если все векторные произведения вектор-стороны окна на вектор «от начала отрезка к точке» будут иметь один знак, то точка лежит в окне.
Знак векторного произведения зависит от стороны обхода окна.
Идея алгоритма (2).
Для всех отрезков выполняются следующие пункты:
1. Отрезок является тривиально видимый? Да – п.9 Нет – п.2.
2. Построить список точек пересечения отрезка со сторонами окна SP{Р1,…, Рn}, n - количество точек пересечения отрезка со сторонами окна.
3. Определить для точки Т1и Т2 лежат ли они в окне.
4. Если n=0 (пересечений с окном нет), то п.5. Иначе п.6.
5. Если Т1 лежит в окне, то рисуем невидимый отрезок иначе видимый. Далее п.9.
6. Нарисовать линию от точки Т1 до Р1 в зависимости от того, лежит точка Т1 в окне или нет (если лежит- стиль отрезка невидимый).
7. Цикл по i от 0 до n-1: Рисуем отрезки с точками Р(i) и Р(i+1) со сменой стиля отрезка в зависимости от того, находится ли точка Т1 в окне или нет. (Если Т1 в окне, то Т1Р1- невидимый отрезок, Р1Р2- видимый, Р1Р3 – невидимый и т.д.)
8. Нарисовать линию от точки Т2 до Рn в зависимости от того, лежит точка Т2 в окне или нет (если лежит- стиль отрезка невидимый).
9. Конец разбора отрезка Т1Т2.
Различие между двумя алгоритмами (отсечение выпуклым и невыпуклым окном) заключается лишь в способе определения лежит ли точка в объекте. Алгоритм (×) рассмотрен для выпуклого окна. Если окно невыпуклое, то оно разбивается на треугольники, а затем уже, для каждого треугольника применяется алгоритм (×). Если данный алгоритм выполнился для i-го треугольника, то точка лежит в невыпуклом окне и проверку вхождения точки в другие треугольники можно прекратить.
Алгоритм отсечения отрезков произвольным окном имеет ту же структуру, что и алгоритм (2), только в п.3. используется описанный выше принцип определения: находится ли точка в окне отсечения.
3.11 Прозрачность
Рис. 3.19 - Стеклянный чайник, слева прозрачный на 10%,
в центре - на 50% и справа - на 90%
Интенсивность участка пересечения двух прозрачных тел определяется по формуле:
, (3.62)
где коэффициент прозрачности тела 1 и 2;
интенсивность объектов 1 и 2.
Перейдем теперь от интенсивности к цвету. Т.е. вместо интенсивности объекта будем рассматривать его цвет.
Цвет объекта состоит из трех компонент: [r, g, b]- красная (r), зеленая (g), синяя (b).
Будем вместо коэффициента прозрачности рассматривать степень прозрачности (ПР) тела. Измеряется ПР в %. Если ПР = 0, то тело абсолютно непрозрачное, при ПР = 1 – абсолютно прозрачное.
Тогда, с учетом этих обозначений, определим цвет участка пересечения двух тел со степенью прозрачности ПР1 и ПР2:
,(3.63)
где - результирующий вектор компонент цвета.
Первое слагаемое в (3.63) определяет, какая часть цвета 1-го объекта остается в результирующем цвете; второе слагаемое - какая часть цвета 2-го объекта участвует в результирующем цвете; на основе соотношения (3.63) и строится весь алгоритм определения результирующего цвета пересечения двух прозрачных тел:
1. Если объекты не пересекаются п.4, иначе п.2.
2. Определить область пересечения объектов
3. Определить цвет области пересечения по формуле (3.63)
4. Конец.
3.12 Тени
Алгоритмы затенения в случае точечных источников света идентичны алгоритмам удаления скрытых поверхностей!!! В алгоритме удаления скрытых поверхностей определяются поверхности, которые можно увидеть из точки зрения, а в алгоритме затенения выделяются поверхности, которые можно «увидеть» из источника света. Поверхности, видимые как из точки зрения, так и из источника света, являются освещенными. Поверхности видимые из точки зрения, но невидимые из источника света находятся в тени. При наличии нескольких распределенных источников света потребуется вычислять как тени, так и полутени.
Поскольку алгоритмы затенения и удаления скрытых поверхностей одинаковы, то существует возможность обрабатывать описание объекта, используя лишь один из этих алгоритмов, последовательно применяя его к точке зрения и к каждому из этих точечных источников света. Совокупность полученных результатов позволяет определить, какие части объекта видимы наблюдателю и какие видны из одного или нескольких источников света. На основании этой информации осуществляется закраска сцены. Источники света предполагаются неподвижными относительно объектов, т. к. тени не зависят от положения точки зрения.
Сложность вычислений зависят и от положения источника света. Легче всего, когда источник находится в бесконечности, и тени определяются с помощью ортогонального проецирования. Сложнее, если источник расположен на конечном расстоянии, но вне поля зрения – здесь необходима перспективная проекция. Самый трудный случай, когда источник находится в поле зрения. Тогда пространство необходимо делить на секторы и искать тени отдельно для каждого сектора.
Тени образуются двумя способами: это собственная тень и проекционная. Собственная тень получается, когда сам объект экранирует все грани от источника света, например, правая грань параллелепипеда на рис 3.20. При этом алгоритм затенения аналогичен алгоритму удаления нелицевых граней, если точку наблюдения совместить с источником света.
Рис 3.20 – Виды теней
Проекционная тень – один объект препятствует попаданию света на другой. Например, тень на горизонтальной плоскости на рис. 3.20. Чтобы найти такие тени, нужно построить проекции всех нелицевых граней на сцену. Центр проекции находится в источнике света. Точки пересечения проецируемой грани со всеми другими плоскостями образуют многоугольники, которые помечаются как теневые многоугольники и заносятся в структуру данных.
После добавления теней к структуре данных, как обычно, строится вид сцены из заданной точки наблюдения. Напомним, что для создания разных видов не нужно вычислять тени заново, так как они зависят только от положения источника (но не наблюдателя).
Рис. 3.21 - Клетка. Справа тень получена алгоритмом
построчного сканирования, слева - трассировкой лучей
Рис. 3.22 - Стеклянная ваза. Справа тень получена алгоритмом построчного сканирования, слева - трассировкой лучей
3.13 Текстура
В компьютерной графике текстурой называется детализация структуры поверхности. Текстура – это одномерное или двумерное изображение, которое имеет множество ассоциированных с ним параметров, определяющих, каким образом производится наложение изображения на поверхность.
Обычно рассматривается два вида детализации. Первый состоит в том, чтобы на гладкую поверхность нанести заранее заданный узор – так называемая детализация светом. После этого поверхность все равно остается гладкой. Второй тип детализации заключается в создании неровностей на поверхности, что реализуется путем внесения возмущений в параметры поверхности – детализация фактурой.
Что такое текстура, говоря обычным языком? Представьте себе, что вы заказали что-то по почте. И вот вам пришла посылка, глядя на которую, вы сразу понимаете, что в ней (рис.3.23). Т.о., текстура – это изображение, наложенное на какую-либо поверхность.
Рис. 3.23 - Наложение текстуры на поверхность
Совершенно очевидно, что создатели графических библиотек не могли оставить в стороне такой способ придания реалистичности создаваемым изображениям.
3.14 Фактура
В компьютерной графике фактурой называется детализация строения поверхности. Обычно рассматриваются два вида детализации. Первый состоит в том, в том чтобы на гладкую поверхность нанести заранее заданный узор. После этого поверхность все равно остается гладкой. Наложение узора на гладкую поверхность выполняется с помощью функции отображения. Второй тип детализации заключается в создании неровностей на поверхности. Такие шероховатые поверхности реализуются путем внесения возмущений в параметры, задающие поверхность.
Рис. 3.24 - Пример наложения текстуры на модель яблока слева и пример наложения текстуры и фактуры одновременнона графин справа
Впервые метод для нанесения рисунка (узора) на поверхность предложил Кэтмул. Этот способ вытекает из его алгоритма разбиения для криволинейных поверхностей.
Главным при нанесении рисунка на поверхность является отображение, поэтому в данном случае задача сводится к преобразованию систем координат Если рисунок задан в фактурном пространстве в прямоугольной системе координат (u, w), а поверхность - в другой прямоугольной системе координат (q,j), то для нанесения рисунка на поверхность нужно найти или задать функцию отображения одного пространства на другое, т. е.
(3.64)
или
(3.65)
Обычно, хотя необязательно, предполагается, что функция отображения линейна:
, (3.66)
где коэффициенты A, B, C, D выводятся из соотношения между двумя точками в системах координат.
Рис. 3.25 - Отображение
Узор на рис. 3.25 задан математически, но он может быть также нарисован от руки, либо получен путем сканирования фотографий и т. д. Для нанесения рисунка на поверхность необходимо отображение объектного пространства в пространство изображения, а также рассмотренное выше преобразование из фактурного пространства в объектное. Может быть применено также любое видовое преобразование. Если для пространства изображения используется растровое устройство, то можно применить два несколько отличающихся метода.
Первый основан на алгоритме разбиения Кэтмула. Алгоритм Кзтмула разбивает кусок поверхности на фрагменты до тех пор, пока фрагмент не будет покрывать центр только одного пикселя. Затем интенсивность пикселя можно было бы найти по узору, который получен при отображении параметрических значений центра фрагмента или пикселя в фактурное пространство. Но такой метод поточечной выборки приводит к сильному лестничному эффекту. Например, можно потерять значительную часть или даже весь узор, показанный на рис. 3.26, а, если все выбранные точки окажутся в “белых” областях узора. Чтобы этого не случилось разбивается как участок поверхности, так и соответствующий узор. Когда найден фрагмент, покрывающий центр только одного пикселя, усредненная интенсивность соответствующего фрагмента узора используется для определения интенсивности пикселя.
В общем случае полученный фрагмент узора не обязательно прямоугольный. Когда он изображается на растровом устройстве, его интенсивность равна средней взвешенной интенсивности пикселовфактуры на данном фрагменте. В качестве весовой функции берется отношение площади пикселов фактуры, находящихся внутри фрагмента, к их полной площади. Таким образом, алгоритм разбиения Кэтмула начинает свою работу на куске поверхности в объектном пространстве и развивается в двух направлениях: в пространстве изображения и фактурном пространстве.
Одно из преимуществ алгоритма разбиения Кэтмула состоит в том, что не обязательно знать обратное преобразование из пространства изображения в объектное пространство или глубину (значение z) фрагмента в пространстве изображения. Однако есть и недостатки: например, фрагмент может не совпадать с одним пикселем в пространстве изображения (рис. 3.26, а).
Часто глубина (значение z) известна из алгоритма удаления невидимых поверхностей. Для того чтобы найти обратное преобразование, нужно сохранить трехмерное видовое преобразование и преобразование объектного пространства в пространство изображения до проецирования на плоскость картины. При этом в фактурное пространство переводится точная площадь, покрываемая пикселем в пространстве изображения. Задача состоит в том, чтобы отобразить площадь пикселя из пространства изображения на поверхность в объектном пространстве, а затем - в фактурное пространство.
Интенсивность пикселя в пространстве изображения равна средней интенсивности пикселов, покрытых этой площадью в фактурном пространстве. На полученный коэффициент умножается диффузная компонента модели освещения.
Рис. 3.26 - Отображение фактуры с помощью разбиения куска
Рис. 3.27 - Пиксел изображения в фактурном пространстве
В рассмотренных методах рисунок наносится на гладкую поверхность, и она после этого остается гладкой. Для того чтобы поверхность казалась шероховатой, можно оцифровать фотографию нерегулярной фактуры и отобразить ее на поверхность. Однако при этом будет казаться, что неровности нарисованы на гладкой поверхности. Дело в том, что в векторе нормали к настоящей шероховатой поверхности и, следовательно, в направлении отражения есть небольшая случайная составляющая. На этой основе Блинн разработал метод возмущения нормали для построения неровных поверхностей.
В любой точке поверхности Q(u, w) частные производные по направлениям u и w, Qu и Qw, лежат в плоскости, касательной к поверхности в этой точке. Нормаль в ней определяется векторным произведением
n = Qu Ä Qw (3.67)
Необходимо построить новую поверхность, которая выглядит шероховатой, внося в направлении нормали функцию возмущения Р(u, w). Таким образом, радиус-вектор точки на новой поверхности есть
(3.68)
Нормаль к возмущенной поверхности имеет вид
(3.69)
Частные производныеивыражаются формулами
(3.70)
(3.71)
Последним членом можно пренебречь, так как P (функция возмущения) очень мала. Поэтому
(3.72)
(3.73)
Возмущенная нормаль имеет вид
(3.74)
Первый член — нормаль n к исходной поверхности, а последний равен нулю, поэтому
, (3.75)
где два последних члена, приведенные к единичной длине, представляют собой возмущение нормали к поверхности и создают соответствующий эффект в модели освещения.
В качестве P можно использовать почти любую функцию, у которой существуют частные производные. Если узор не определяется аналитически, то функция возмущения записывается как двумерная таблица цветов с индексами u, w. Промежуточные значения вычисляются билинейной интерполяцией табличных величин, а производные Pu и Pw вычисляются методом конечных разностей.
Эффект шероховатости зависит от масштаба изображаемого объекта. Например, если размер объекта увеличится в два раза, то величина вектора нормали возрастет в четыре раза, а его возмущения - только в два. Это приводит к тому, что увеличенный объект кажется более гладким. Однако масштаб фактуры на перспективном изображении не зависит от перемещения объекта в пространстве по направлению к наблюдателю или от него. При изображении фактуры с помощью функции возмущения может появиться лестничный эффект, но если воспользоваться рассмотренным выше способом усреднения по площади фактуры или методами устранения лестничного эффекта, основывающимися на предварительной фильтрации, то фактура может полностью сгладиться. Показано,что необходимо рассчитывать изображение с разрешением большим, чем у дисплея, а затем отфильтровать или усреднить его и вывести с более низким разрешением экрана.
Один из последних методов построения нерегулярностей основан на фрактальных поверхностях. Фрактальная поверхность состоит из случайно заданных полигональных или биполиномиальных поверхностей. В компьютерной графике этот метод первым применили Карпентер, а также Фурнье и Фассел. С помощью фрактальных поверхностей изображались природные объекты — камни, деревья, облака, а также ландшафты. Этот метод основан на работе Мандельброта. Для того чтобы получить полигональную фрактальную поверхность, исходный многоугольник рекурсивно разбивается на фрагменты, как показано на рис. 3.28.
Рис. 3.28 - Формирование фрактальной поверхности
Для этого можно, например, случайным образом сместить центр и середины сторон многоугольника, причем и исходный, и полученный многоугольники не обязательно должны быть плоскими. Одно из преимуществ фрактальных поверхностей в том, что их можно разбивать “бесконечно” и получить любой уровень детализации. Он может зависеть от положения наблюдателя: чем ближе точка наблюдения, тем с большей степенью детализации изображается поверхность. Если наблюдатель находится далеко, объем вычислений значительно сокращается. Фрактальная поверхность изображается с помощью любого подходящего алгоритма удаления невидимых поверхностей и любой модели освещения. Однако число разбиений возрастает со скоростью выше линейной, поэтому между количеством разбиений и уровнем детализации должен быть некоторый компромисс. Иначе потребуется слишком много вычислений.
КОНТРОЛЬНАЯ РАБОТА ПО КУРСУ
«КОМПЬЮТЕРНАЯ ГРАФИКА»
Контрольная работа состоит из трех заданий, в каждом задании 15 вариантов, номера которых выбираются по номеру варианта студента (N). Задания выполняются на языках программирования Pascal или С/C++ для платформ DOS или Windows и высылаются в виде архивированного (kgN.zip, kgN.rar) пакета файлов, который должен содержать:
ü файлы исходного кода и файлы проекта[1] (для каждого задания в отдельном каталоге: task1, task2, task3);
ü идентификационный файл (about.me), содержащий:
- ФИО и код студента;
- номер специальности;
- наименование системы программирования и версия;
- список каталогов и файлов, входящих в пакет, с описанием каждого;
- дополнительные комментарии;
ü файл отчета по проделанной работе (kgN.doc) в формате Word6.0/97.
Отчет должен содержать:
· Титульный лист с указанием наименования дисциплины и идентификационных данных автора.
· Цель работы.
· Раздел 1…3. Для каждого задания включить:
- постановка задачи;
- содержательное описание метода решения задачи с использованием математического аппарата;
- листинг исходного кода[2], который относится к методу решения задачи с подробными(!) комментариями;