торый решает задачу удаления невидимых поверхностей, является специальный случай алгоритма Z-буфера. Используемое в этом алгоритме окно визуализации имеет высоту в одну сканирующую строку и ширину во весь экран. Как для буфера кадра, так и для Z-буфера требуется память высотой в 1 бит, шириной в горизонтальное разрешение экрана и глубиной в зависимости от требуемой точности. Обеспечиваемая точность по глубине зависит от диапазона значений, которые может принимать Z. Например, буфер кадра может иметь размер 1х512х24 бит, а Z-буфер - 1х512х20 бит.
Концептуально этот алгоритм достаточно прост. Для каждой сканирующей строки буфер кадра инициализируется с фоновым значением интенсивности, а Z-буфер - с минимальным значением Z. Затем определяется пересечение сканирующей строки с двумерной проекцией каждого многоугольника сцены, если они существуют. Эти пересечения образуют пары. При рассмотрении каждого пиксела на сканирующей строке в интервале между концами пар его глубина сравнивается с глубиной, содержащейся в соответствующем элементе Z-буфера. Если глубина этого пиксела больше глубины из Z-буфера, то рассматриваемый отрезок будет текущим видимым отрезком. И следовательно, атрибуты многоугольника, соответствующего данному отрезку, заносятся в буфер кадра в позиции данного пиксела; соответственно корректируется и Z-буфер в этой позиции. После обработки всех многоугольников сцены буфер кадра размером в одну сканирующую строку содержит решение задачи удаления невидимых поверхностей для данной сканирующей строки. Он выводится экран дисплея в порядке, определяемом растровым сканированием, т. е. слева направо. В этом алгоритме можно использовать методы устранения ступенчатости, основывающиеся как на пре-, так и на постфильтрации.
Однако практически сравнение каждого многоугольника с каждой сканирующей строкой оказывается неэффективным. Поэтому используется некоторая разновидность списка упорядоченных ребер. В частности, для повышения эффективности этого алгоритма применяются групповая сортировка оси Y, список активных многоугольников и список активных ребер.
С использованием этих методов алгоритм построчного сканирования с Z-буфером формулируется следующим образом:
Подготовка информации:
Для каждого многоугольника определить самую верхнюю сканирующую строку, которую он пересекает.
Занести многоугольник в группу Y, соответствующую этой сканирующей строке.
Запомнить для каждого многоугольника, например в связном списке, как минимум следующую информацию: dY - число сканирующих строк, которые пересекаются этим многоугольником; список ребер многоугольника; коэффициенты (a, b, с, d) уравнения плоскости многоугольника; визуальные атрибуты многоугольника.
Решение задачи удаления невидимых поверхностей: Инициализировать буфер кадра дисплея.
Для каждой сканирующей строки:
Инициализировать буфер кадра размером с одну сканирующую строку, заполнив его фоновым значением. Инициализировать Z-буфер размером с одну сканирующую строку значением Zmin.
Проверить появление в группе Y сканирующей строки новых многоугольников. Добавить все новые многоугольники к списку активных многоугольников.
Проверить появление новых многоугольников в списке активных многоугольников. Добавить все пары ребер новых
многоугольников к списку активных ребер.
Если какой-нибудь элемент из пары ребер многоугольника удаляется из списка активных ребер, то надо определить, сохранился ли соответствующий многоугольник в списке активных многоугольников. Если сохранился, то укомплектовать пару активных ребер этого многоугольника в списке активных ребер. В противном случае удалить и второй элемент пары ребер из списка активных ребер.
В списке активных ребер содержится следующая информация для каждой пары ребер многоугольника, которые пересекаются сканирующей строкой:
Xл - пересечение левого ребра из пары с текущей сканирующей строкой.
dXл - приращение Xл в интервале между соседними сканирующими строками.
dYл - число сканирующих строк, пересекаемых левой стороной.
Xп - пересечение правого ребра из пары с текущей сканирующей строкой.
dXп - приращение Xп в интервале между соседними сканирующими строками.
dYп - число сканирующих строк, пересекаемых правой стороной.
Zл - глубина многоугольника в центре пиксела, соответствующего левому ребру.
dZx - приращение по т. вдоль сканирующей строки. Оно равно а/с при с <> 0.
dZy - приращение по Z в интервале между соседними сканирующими строками. Оно равно b/с при с <> 0.
Пары активных ребер многоугольников заносятся в соответствующий список в произвольном порядке. В пределах одной пары пересечения упорядочены слева направо. Для одного многоугольника может оказаться более одной пары активных ребер.
Для каждой пары ребер многоугольника из списка активных ребер:
Извлечь эту пару ребер из списка активных ребер. Инициализировать Z со значением Zл.
Для каждого пиксела, такого, что Xл <= X+1/2 <= Хп, вычислить глубину Z(X+1/2, Y+1/2) в его центре, используя уравнение плоскости многоугольника.
Сравнить глубину Z(X+1/2, Y+1/2) с величиной Zбyфер(X), хранящейся в Z-буфере для одной сканирующей строки. Если Z(X+1/2, Y+1/2) > Zбуфер(X), то занести атрибуты многоугольника в буфер кадра для одной сканирующей строки и заменить Zбуфер(X) на Z(X+1/2, Y+1/2). В противном случае не производить никаких действий.
Записать буфер кадра для сканирующей строки в буфер кадра дисплея.
Скорректировать список активных ребер:
Для каждой пары ребер многоугольника определить dYл и dYп. Если dYл или dYп < 0, то удалить соответствующее ребро из списка. Пометить положение обоих ребер, в списке и породивший их многоугольник.
Вычислить новые абсциссы пересечений: Xлнов = Xлстар + dXл
Xпнов = Xпстар + dXп
Вычислить глубину многоугольника на левом ребре, используя уравнение плоскости этого многоугольника. Сок-
36
ратить список активных многоугольников. Если dY < 0 для какого-нибудь многоугольника, то удалить его из списка.
Как раньше используется предварительное удаление нелицевых плоскостей.
АЛГОРИТМЫ ПОСТРОЧНОГО СКАНИРОВАНИЯ ДЛЯ КРИВОЛИНЕЙНЫХ ПОВЕРХНОСТЕЙ
Криволинейную поверхность можно, разумеется, аппроксимировать многогранником и воспользоваться одним из изложенных выше алгоритмов построчного сканирования. Однако для получения высокой точности число граней многоугольника, необходимых для описания достаточно сложной сцены, огромно. Кроме того, если не использовать при этом интерполяционные методы закраски, то результат будет выглядеть состоящим из граней. В любом случае контурные ребра окажутся кусочно-линейными, т. е. будут выглядеть как ломаные, состоящие из коротких прямолинейных отрезков.
То, что в алгоритме построчного сканирования сцена рассекается сканирующей плоскостью, проходящей через точку наблюдения и сканирующую строку, сразу демонстрирует различие между полигональной и криволинейной (скульптурной) параметрическими поверхностями. Для полигональной поверхности все пересечения со сканирующей плоскостью являются прямолинейными отрезками. Эти прямолинейные отрезки легко описать их концевыми точками. Для криволинейной параметрической поверхности ее пересечение со сканирующей плоскостью задается уравнением
Y(u, w) = Yскан = const
где u и w - параметры, задающие поверхность. В результате получается кривая, называемая линией уровня или контуром. Эта кривая не обязательно описывается однозначной функцией. Более того, контур любого уровня может содержать несколько кривых. Наконец, мало найти кривую (или кривые), образованные пересечением поверхности со сканирующей плоскостью, нужно, кроме того, найти проекции каждой ее точки на сканирующую строку, т. е. X = = X(u, w), и уметь вычислять глубину кривой при этом значении абсциссы, т. е. Z = Z(u, w), чтобы определять ее видимость.
Математически последнее требование можно сформулировать так. Дана ордината Y сканирующей строки и абсцисса X точки, лежащей на этой строке. Необходимо вычислить значения параметров u, w, т. е.
найти u = u(X, Y) и w = w(X, Y).
Если значения этих параметров известны, то глубина вычисляется по формуле Z=Z(u, w). Следовательно, можно вычислить атрибуты видимости исходной точки, лежащей на сканирующей строке. К сожалению, точное решение этих уравнений не известно. В алгоритмах используют численные методы для получения решения. В частности, использовался итерационный метод Ньютона - Рафсона. Метод Ньютона - Рафсона нуждается в начальном приближении. Для получения такого начального приближения и сокращения числа итераций на один пиксел используется свойство когерентности сканирующих строк. К сожалению, итерационный процесс в методе Ньютона -- Рафсона может расходиться. Кратко, в контексте структуры алгоритма построчного сканирования, внутренний цикл алгоритма для криволинейных поверхностей таков:
Параметрическая поверхность задана списком активных элементов, описанных параметрическими уравнениями:
X = X(u, w ), Y = Y(u, w ), Z = Z(u, w )
Для каждой сканирующей строки (ее ордината равна Y):
Для каждого пиксела на этой строке (его абсцисса равна X): Для каждой поверхности, пересекающей эту сканирующую
плоскость при данном X:
Решить уравнения: u = u(X,Y), w = w(X,Y). Вычислить глубину поверхности: Z=Z(u, w).
Определить поверхность, видимую при заданных X и Y, и изобразить пиксел с ее атрибутами.
Данный алгоритм иллюстрирует еще одно важное отличие многогранника от криволинейной параметрической поверхности. В алгоритме говорится: "Для каждой поверхности, пересекающей эту сканирующую плоскость". Поверхности становятся активными на самой верхней и неактивными на самой низшей из пересекающих их сканирующих плоскостей. Эти пересечения возникают на локальных максимумах и минимумах поверхностей. Для полигональных поверхностей эти локальные экстремумы всегда совпадают с их вершинами. В алгоритмах построчного сканирования эти вершины и соединяющие их ребра многогранника используются для решения вопросов о том, когда грань следует добавить или удалить из списков активных граней и ребер.
Для криволинейных поверхностей локальные экстремумы не обязательно совпадают с их вершинами. Часто они располагаются внутри поверхности вдоль контурных ребер. Контурное ребро, лежащее внутри поверхности, определяется обнулением компоненты Z у вектора нормали к поверхности. В случае криволинейной поверхности ее грань можно добавить в список активных граней или удалить из него при обработке контурных ребер, а интервалы вдоль сканирующей строки могут начинаться и заканчиваться на таких ребрах. Эта задача решается путем эффективного разбиения поверхности вдоль контурных ребер.
Алгоритмы визуализации параметрических криволинейных поверхностей, принадлежащие Лейну - Карпентеру и Кларку, основываются прежде всего на методах разбиения поверхностей. В этих алгоритмах результат упорядочен по ходу сканирования строк развертки. Алгоритмы выполняют групповую сортировку по Y элементов поверхности, основываясь на максимальных значениях ординаты каждого из этих элементов. Для каждой сканирующей строки те элементы из списка активных элементов, которые пересекаются соответствующей сканирующей плоскостью, подразделяются до тех пор, пока каждый новый элемент не станет удовлетворять критерию пологости или не перестанет пересекаться со сканирующей плоскостью. Те части элементов, которые больше не пересекаются со сканирующей плоскостью, заносятся в список неактивных элементов для последующего рассмотрения. Те же части элементов, которые удовлетворяют критерию пологости, далее начинают считаться плоскими многоугольниками и преобразовываться в растровую форму с помощью алгоритма построчного сканирования для многоугольников. Однако каждый из таких приближенно плоских многоугольников остается параметрическим элементом. Вся информация, имеющаяся для подобного элемента поверхности, используется для определения визуальных атрибутов отдельных пикселов в процессе преобразования многоугольника в растровую форму. Использование этой информации позволяет произвести гладкое сопряжение этих элементов. Если плоским считать элемент, размеры которого меньше одного пиксела, то полученный контур будет гладким. Далее, задние или нелицевые многоугольники можно удалить простым вычислением нормали к поверхности. Если нормаль направлена не в сторону наблюдателя, то соответствующая часть элемента удаляется. Это позволяет сэкономить большой объем вычислений.
Хотя оба алгоритма Лейна - Карпентера и Кларка используют изложенную идею, в алгоритме Кларка элементы проходят до растровой развертки предварительную обработку, в то время как в алгоритме Лейна - Карпентера элементы динамически подразделяются в процессе обработки кадра. Алгоритм Лейна - Карпентера требует
37
значительно меньше памяти, чем алгоритм Кларка, но осуществляет больше разбиений.
В контексте алгоритма построчного сканирования внутренний цикл алгоритма Лейна - Карпентера кратко записывается так:
Для каждой сканирующей строки с ординатой Y:
Для каждого элемента из списка активных элементов: if элемент плоский
then
занести этот элемент в список многоугольников
else
разбить этот элемент на подэлементы
if подэлемент еще пересекается со сканирующей плоскостью
then
занести его в список активных элементов
else
занести его в список неактивных элементов end if
end if
Произвести растровую развертку многоугольников из списка многоугольников.
Оценка обеих алгоритмов Лейна - Карпентера и Кларка зависит от свойств конкретных базисных функций, используемых для генерации параметрических элементов с целью их эффективного разбиения. Эти алгоритмы применимы к любым параметрическим элементам поверхности, для которых имеется эффективный алгоритм разбиения. Единственный недостаток этих алгоритмов адаптивного разбиения заключается в том, что из-за несоответствия между приближенными полигональными элементами и точными параметрическими элементами могут образовываться разрывы или дыры в поверхности.
Квадратичные поверхности, вообще говоря, в чем-то проще, чем параметрические элементы поверхности. Типичными примерами квадратичных поверхностей являются сферы, конусы, цилиндры, а также эллипсоиды и гиперболоиды вращения.
Сферы, как подмножество квадратичных поверхностей, представляют особый интерес в задачах молекулярного моделирования. Разработано несколько алгоритмов построчного сканирования специально для сфер. Ограничиваясь случаем ортогональных проекций, Портер эффективно использовал алгоритм Брезенхема для окружностей, чтобы формировать контур сферы. Более того, поскольку пересечение сканирующей плоскости со сферой тоже является окружностью, то можно воспользоваться алгоритмом Брезенхема для окружностей, чтобы инкрементально вычислять глубину каждой сферы на сканирующей строке. Наконец, алгоритм Брезенхема используется для устранения ступенчатости контурных ребер путем поддержания списка приоритетов сфер, основанных на глубинах их центров. Сортировка по приоритету позволяет также учесть эффекты прозрачности.
АЛГОРИТМ ОПРЕДЕЛЕНИЯ ВИДИМЫХ ПОВЕРХНОСТЕЙ ПУТЕМ ТРАССИРОВКИ ЛУЧЕЙ
Оценки эффективности всех алгоритмов удаления невидимых поверхностей зависят от определенных характеристик когерентности той сцены, для которой ведется поиск ее видимых участков. В отличие от них трассировка лучей является методом грубой силы, т.е. не учитывающим специфику обрабатываемого объекта. Главная идея, лежащая в основе этого метода, заключается в том, что наблюдатель видит любой объект посредством испускаемого неким источником света, который падает на этот объект и затем каким-то путем доходит
до наблюдателя. Свет может достичь наблюдателя, отразившись от поверхности, преломившись или пройдя через нее. Если проследить за лучами света, выпущенными источником, то можно убедиться, что весьма немногие из них дойдут до наблюдателя. Следовательно, этот процесс был бы вычислительно неэффективен. Аппель первым предложил отслеживать (трассировать) лучи в обратном направлении, т. е. от наблюдателя к объекту. Впоследствии Кэй и Уиттед реализовали алгоритмы трассировки лучей с использованием общих моделей освещения. Эти алгоритмы учитывают эффекты отражения одного объекта от поверхности другого, преломления, прозрачности и затенения. Производится также устранение ступенчатости.
Рассмотрим один из вариантов алгоритма трассировки лучей. Предполагается, что сцена уже преобразована в пространство изображения. Перспективное преобразование не используется. Считается, что точка зрения или наблюдатель находится в бесконечности на положительной полуоси Z. Поэтому все световые лучи параллельны оси Z. Каждый луч, исходящий от наблюдателя, проходит через центр пиксела на растре до сцены. Траектория каждого луча отслеживается, чтобы определить, какие именно объекты сцены, если таковые существуют, пересекаются с данным лучом. Необходимо проверить пересечение каждого объекта сцены с каждым лучом. Если луч пересекает объект, то определяются все возможные точки пересечения луча и объекта. Можно получить большое количество пересечений, если рассматривать много объектов. Эти пересечения упорядочиваются по глубине. Пересечение с максимальным значением Z представляет видимую поверхность для данного пиксела. Атрибуты этого объекта используются для определения характеристик пиксела. Если точка зрения находится не в бесконечности, алгоритм трассировки лучей лишь незначительно усложняется. Здесь предполагается, что наблюдатель по-прежнему находится на положительной полуоси Z. Картинная плоскость, т. е. растр, перпендикулярна оси Z. Задача состоит в том, чтобы построить одноточечную центральную проекцию на картинную плоскость.
Наиболее важным элементом алгоритма определения видимых поверхностей путем трассировки лучей, является процедура определения пересечений. В состав сцены можно включать любой объект для которого можно создать процедуру построения пересечений. Объекты сцены могут состоять из набора плоских многоугольников, многогранников или тел, ограниченных или определяемых квадратичными или биномиальными параметрическими поверхностями. Поскольку 75-95% времени, затрачиваемого алгоритмом трассировки лучей, уходит на определение пересечений, то эффективность процедуры поиска пересечений оказывает значительное влияние на производительность всего алгоритма. Вычислительная стоимость определения пересечений произвольной пространственной прямой (луча) с одним выделенным объектом может оказаться высокой. Чтобы избавиться от ненужного поиска пересечений, производится проверка пересечения луча с объемной оболочкой рассматриваемого объекта. И если луч не пересечет оболочки, то не нужно больше искать пересечений этого объекта с лучом. В качестве оболочки можно использовать прямоугольный параллелепипед или сферу. Хотя использование сферы в качестве оболочки может оказаться неэффективным, факт пересечения трехмерного луча со сферой определяется очень просто. В частности, если расстояние от центра сферической оболочки до луча превосходит радиус этой сферы, то луч не пересекает оболочки. Следовательно, он не может пересечься и с объектом.
Поэтому тест со сферической оболочкой сводится к определению расстояния от точки до трехмерной прямой, т. е. луча. Будем использовать параметрическое представление прямой, проходящей через точки Р1(X1, Y1, Z1) и Р2(X1, Y2, Z2), т.е.
38
Р(t) = P1 + (P2 - P1)t
с компонентами
X=X1 + (Х2-Х1)t = X1 + at
Y=Y1 + (Y2-Y1)t = Y1 + bt Z=Z1 + (Z2-Z1)t = Z1 + ct
Если минимальное расстояние от этой прямой до точки Р0(X0, Y0, Z0) больше радиуса сферической оболочки, то луч не может пересечься с объектом.
Выполнение габаритного теста с прямоугольной оболочкой в трехмерном пространстве требует большого объема вычислений. При этом следует проверить пересечение луча по меньшей мере с тремя бесконечными плоскостями, ограничивающими прямоугольную оболочку. Поскольку точки пересечения могут оказаться вне граней этого параллелепипеда, то для каждой из них следует, кроме того, произвести проверку на охват или попадание внутрь. Следовательно, для трех измерений тест с прямоугольной оболочкой оказывается более медленным, чем тест со сферической оболочкой.
Одной простой процедурой можно свести тест с прямоугольной оболочкой к сравнению знаков, упрощая тем самым вычисление пересечений с объектом, а также сравнения по глубине среди точек пересечения. В этой процедуре используются переносы и повороты вокруг координатных осей для того, чтобы добиться совпадения луча с осью Z. Аналогичным преобразованиям подвергается и прямоугольная оболочка объекта. Луч пересекает оболочку, если в новой перенесенной и повернутой системе координат знаки Xmin и Xmax, а также Ymin и Ymax противоположны.
Алгоритм трассировки лучей для простых непрозрачных поверхностей можно представить следующим образом:
Подготовка данных для сцены:
Создать список объектов, содержащий по меньшей мере следующую информацию:
Полное описание объекта: тип, поверхность, характеристики и т. п.
Описание сферической оболочки: центр и радиус.
Флаг прямоугольной оболочки. Если этот флаг поднят, то будет выполнен габаритный тест с прямоугольной оболочкой, если же он опущен, то тест выполняться не будет. Заметим, что габаритный тест необходим не для всех объектов, например для сферы он не нужен.
Описание прямоугольной оболочки: Xmin, Xmax, Ymin,
Ymax, Zmin, Zmax
Для каждого трассируемого луча:
Выполнить для каждого объекта трехмерный тест со сферической оболочкой в исходной системе координат. Если луч пересекает эту сферу, то занести объект в список активных объектов.
Если список активных объектов пуст, то изобразить данный пиксел с фоновым значением интенсивности и продолжать работу. В противном случае, перенести и повернуть луч так, чтобы он совместился с осью Z. Запомнить это комбинированное преобразование.
Для каждого объекта из списка активных объектов:
Если флаг прямоугольной оболочки поднят, преобразовать, используя комбинированное преобразование, эту оболочку в систему координат, в которой находится луч, и выполнить соответствующий тест. Если пересечения с лучом нет, то перейти к следующему объекту. В противном случае преобразовать, используя комбинированное преобразование, объект в систему координат, в которой находится
луч, и определить его пересечения с лучом, если они существуют. Занести все пересечения в список пересечений.
Если список пересечений пуст, то изобразить данный пиксел с фоновым значением интенсивности.
В противном случае определить Zmax для списка пересечений. Вычислить преобразование, обратное комбинированному преобразованию.
Используя это обратное преобразование, определить точку пересечения в исходной системе координат.
Изобразить данный пиксел, используя атрибуты пересеченного объекта и соответствующую модель освещенности.
ПОСТРОЕНИЕ РЕАЛИСТИЧЕСКИХ ИЗОБРАЖЕНИЙ
ПРОСТАЯ МОДЕЛЬ ОСВЕЩЕНИЯ
Световая энергия, падающая на поверхность, может быть поглощена, отражена или пропущена. Частично она поглощается и превращается в тепло, а частично отражается или пропускается. Объект можно увидеть, только если он отражает или пропускает свет; если же объект поглощает весь падающий свет, то он невидим и называется абсолютно черным телом. Количество поглощенной, отраженной или пропущенной энергии зависит от длины волны света. При освещении белым светом, в котором интенсивность всех длин волн снижена примерно одинаково, объект выглядит серым. Если поглощается почти весь свет, то объект кажется черным, а если только небольшая его часть - белым. Если поглощаются лишь определенные длины волн, то у света, исходящего от объекта, изменяется распределение энергии
иобъект выглядит цветным. Цвет объекта определяется поглощаемыми длинами волн.
Свойства отраженного света зависят от строения, направления
иформы источника света, от ориентации и свойств поверхности. Отраженный от объекта свет может также быть диффузным или зеркальным. Диффузное отражение света происходит, когда свет как бы проникает под поверхность объекта, поглощается, а затем вновь испускается. При этом положение наблюдателя не имеет значения, так как диффузно отраженный свет рассеивается равномерно по всем направлениям. Зеркальное отражение происходит от внешней поверхности объекта.
Свет точечного источника отражается от идеального рассеивателя по закону косинусов Ламберта: интенсивность отраженного света пропорциональна косинусу угла между направлением света и нормалью к поверхности, т. е.
I = S*k*cos(a)
где I - интенсивность отраженного света, S - интенсивность точечного источника, k - коэффициент диффузного отражения (0 <= k <= 1), a - угол между направлением света и нормалью к поверхности. Если a > 1.57, то источник света расположен за объектом. Коэффициент диффузного отражения зависит от материала и длины волны света, но в простых моделях освещения обычно считается постоянным.
Поверхность предметов, изображенных при помощи простой модели освещения с ламбертовым диффузным отражением, выглядит блеклой и матовой. Предполагается, что источник точечный поэтому объекты, на которые не падает прямой свет, кажутся черными. Однако на объекты реальных сцен падает еще и рассеянный свет, отраженный от окружающей обстановки, например от стен комнаты. Рассеянному свету соответствует распределенный источник. Поскольку для расчета таких источников требуются большие вычислительные затраты, в машинной графике они заменяются на коэффициент рассеяния - констан-
39
ту, которая входит в формулу в линейной комбинации со |
слагаемым |
|
Ламберта: |
|
|
I = D*m + S*k*cos(a) |
0 <= a <= 1.57 |
(1) |
где D - интенсивность рассеянного света, |
m - коэффициент диффуз- |
|
ного отражения рассеянного света (0 <= m <= 1). |
|
|
Пусть даны два объекта, одинаково |
ориентированные |
относи- |
тельно источника, но расположенные на разном расстоянии от него. Если найти их интенсивность по данной формуле, то она окажется одинаковой. Это значит, что, когда предметы перекрываются, их невозможно различить, хотя интенсивность света обратно пропорциональна квадрату расстояния от источника, и объект, лежащий дальше от него, должен быть темнее. Если предположить, что источник света находится в бесконечности, то диффузный член модели освещения обратится в нуль. В случае перспективного преобразования сцены в качестве коэффициента пропорциональности для диффузного слагаемого можно взять расстояние от центра проекции до объекта. Но если центр проекции лежит близко к объекту, то величина, обратная квадрату расстояния, изменяется очень быстро, т. е. у объектов, лежащих примерно на одинаковом расстоянии от источника, разница интенсивностей чрезмерно велика. Как показывает опыт, большей реалистичности можно добиться при линейном затухании. В этом случае
модель освещения |
выглядит так: |
|
|
I = D*m + |
(S*k*cos(a))/(d + K) |
0 <= a <= 1.57 |
(2) |
где K - произвольная постоянная.
Если предполагается, что точка наблюдения находится в бесконечности, тo d определяется положением объекта, ближайшего к точке наблюдения. Это означает, что ближайший объект освещается с полной интенсивностью источника, а более далекие- с уменьшенной. Для цветных поверхностей модель освещения применяется к каждому из трех основных цветов.
Интенсивность зеркально отраженного света зависит от угла падения, длины волны падающего света и свойств вещества. Основное уравнение Френеля приводится в любой книге по геометрической оптике. Зеркальное отражение света является направленным. Угол отражения от идеальной отражающей поверхности (зеркала) равен углу падения, в любом другом положении наблюдатель не видит зеркально отраженный свет. Это означает, что вектор наблюдения совпадает с вектором отражения, и угол равен нулю. Если поверхность не идеальна, то количество света, достигающее наблюдателя, зависит от пространственного распределения зеркального отраженного света. У гладких поверхностей распределение узкое или сфокусированное, у шероховатых - более широкое.
Благодаря зеркальному отражению на блестящих предметах появляются световые блики. Из-за того что зеркально отраженный свет сфокусирован вдоль вектора отражения, блики при движении наблюдателя тоже перемешаются. Более того, так как свет отражается от внешней поверхности (за исключением металлов и некоторых твердых красителей), то отраженный луч сохраняет свойства падающего. Например, при освещении блестящей синей поверхности белым светом возникают белые, а не синие блики.
В простых моделях освещения обычно пользуются эмпирической моделью Буи-Туонга Фонга, так как физические свойства зеркального отражения очень сложны. Модель Фонга имеет вид:
n |
|
S*w(l,X)*cos (b) |
(3) |
где w(l, X) - кривая отражения, представляющая отношение зеркально отраженного света к падающему как функцию угла падения l и длины волны X; n - степень, аппроксимирующая пространственное распределение зеркально отраженного света. большие значения n дают сфокусированные пространственные распределения характеристик
металлов и других блестящих поверхностей, а малые - более широкие распределения для неметаллических поверхностей, например бумаги; b - угол между вектором наблюдения и отраженным лучом.
Коэффициент зеркального отражения зависит от угла падения, однако даже при перпендикулярном падении зеркально отражается только часть света, а остальное либо поглощается, либо отражается диффузно. Эти соотношения определяются свойствами вещества и длиной волны. Коэффициент отражения для некоторых неметаллов может быть всего 4%, в то время как для металлических материалов - более 80%. При падении под скользящим углом (a = 90°) отражается весь падающий свет (коэффициент отражения 100%).
Объединяя эти результаты с формулой рассеянного света и диффузного отражения, получим модель освещения:
n
I = D*m + (S*k*cos(a) + w(l,X)*cos (b))/(d + K) (4) 0 <= a <= 1.57
Функция w(l, X) довольно сложна, поэтому ее обычно заменяют константой C, которая либо выбирается из эстетических соображений, либо определяется экспериментально. Таким образом,
n
I = D*m + (S*k*cos(a) + C*cos (b))/(d + K) (5) 0 <= a <= 1.57
В машинной графике эта модель часто называется функцией закраски и применяется для расчета интенсивности или тона точек объекта или пикселов изображения. Чтобы получить цветное изображение, нужно найти функции закраски для каждого из трех основных цветов. Константа C, обычно одинакова для всех трех основных цветов, поскольку цвет зеркально отраженного света определяется цветом падающего.
Если имеется несколько источников света, то их эффекты суммируются.
Косинус угла падения равен скалярному произведению единичных векторов соответственно нормали к поверхности и направления к источнику.
ОПРЕДЕЛЕНИЕ НОРМАЛИ К ПОВЕРХНОСТИ
Нормаль к поверхности представляет ее локальную кривизну, а следовательно, и направление зеркального отражения. Если известно аналитическое описание поверхности, то нормаль вычисляется непосредственно. Но для многих поверхностей бывает задана лишь их полигональная аппроксимация. Зная уравнение плоскости каждой грани, можно найти направление внешней нормали.
Во многих алгоритмах удаления невидимых линий и поверхностей используются только ребра или вершины, поэтому, для того чтобы объединить их с моделью освещения, необходимо знать приближенное значение нормали на ребрах и в вершинах. Пусть заданы уравнения плоскостей полигональных граней, тогда нормаль к их общей вершине равна среднему значению нормалей ко всем многоугольникам, сходящимся в этой вершине.
Если же уравнения плоскостей не заданы, то нормаль к вершине можно определить, усредняя векторные произведения всех ребер, пересекающихся в вершине. Следует обратить внимание на то, что необходимы только внешние нормали. Кроме того, если полученный вектор не нормируется, то его величина зависит от количества и площади конкретных многоугольников, а также от количества и длины конкретных ребер. Сильнее проявляется влияние многоугольников с большей площадью и более длинных ребер.
Когда нормаль к поверхности используется для определения ин-
40