Согласно модели Уиттеда
цвет некоторой точки объекта определяется суммарной интенсивностью
I(l)=Ka*Ia(l)C(l) + Kd*Id(l)*C(l) +Ks*Is(l) + Kr*Ir(l) +Kt*It(l) (1)
где l – длина волны, C(l) – заданный
исходный цвет точки объекта, Ka, Kd, Ks, Kr и Kt – коэффициенты,
учитывающие свойства конкретного объекта параметрами фоновой интенсивности,
диффузного рассеивания, зеркальности, отражения и прозрачности.
Ia – интенсивность фоновой
подсветки,
Id – интенсивность, учитываемая
для диффузного рассеивания,
Is – интенсивность, учитываемая
для зеркальности,
Ir – интенсивность излучения,
пришедшая по отраженному лучу,
It – интенсивность излучения,
пришедшая по преломленному лучу.
Интенсивность фоновой
подсветки (Ia) для некоторого объекта обычно
константа. Запишем формулы для остальных интенсивностей.
Надо заметить, что в
модели Уиттеда в чистом виде есть один существенный недостаток. Дело в том, что
доля световой энергии отраженной от поверхности объекта зависит от угла падения
и преломления. Например, если смотреть вдоль поверхности стекла, то доля
отраженного света повысится, а преломленного понизится. Но в модели Уиттеда
коэффициенты, отражающие доли интенсивности отраженного и преломленного света в
суммарной интенсивности точки поверхности объекта задаются константами (не
зависят от угла). В большинстве случаев это дает приемлемый результат. Но при
моделировании стекла мы встречаемся с эффектом полного внутреннего отражения.
Некоторые лучи света не могут выйти из толщи стекла за заданное фиксированное
число итераций. В результате этого по краям стакана возникает четкая черная
полоса. Если учесть зависимость интенсивности отраженного и преломленного света
от углов падения и преломления, то эффект будет намного более реалистичным.
Края черной области размоются.
Для вычисления
коэффициента при интенсивности отраженного луча используется следующая формула:
r = 0.5(cos α - Ncos β)2
/(cos α + Ncos β)2
+ 0.5(Ncos α – cos β)2 /(Ncos α+ cos β)2 (2)
где α – угол падения луча, β – угол преломления луча, N – относительный показатель преломления двух сред.
Коэффициент при
интенсивности преломленного луча вычисляется по формуле:
t = 1 – r (3)
Схема рассчета интенсивности. Параметры, задающие свойства тел
В связи с недостатками
модели Уиттеда в этой программе предлагается следующая система вычисления
интенсивности света в точке.
Интенсивность света
складывается из интенсивности фоновой подсветки сцены, интенсивности диффузно
отраженного света источников, интенсивности бликов от источников («локальные»
характеристики освещенности), интенсивности зеркально отраженного луча и
интенсивности преломленного луча, если таковые имеются.
Интенсивность фоновой
подсветки (IA) задается некоторой
константой.
Интенсивность диффузно
отраженного света (ID) вычисляется по
классическому «закону косинуса».
ID = IL cos α (4)
где IL – интенсивность источника света, α –
угол между нормалью к поверхности и направлением на источник.
В случае освещения
сцены несколькими источниками Id
вычисляется для каждого из них и затем суммируются.
IDi =Σ ILi
cos αi
(5)
Интенсивность блика от
источника (IS) вычисляется в
соответствии с моделью Фонга.
S =
IL cosp β
(6)
где IL – интенсивность источника света (0<=IL<=1), β –
угол между отраженным лучом от источника света и направлением на точку, в
которой расположена камера (центр проекции), p – некоторая степень от 1 до 200 –влияет на размытость
блика. При маленьких значениях p блик более
размытый.
Вычисление нормалей
В алгоритме трассировки
нормали к объектам необходимы для вычисления отраженного и преломленного лучей,
а также для определения освещенности согласно модели Фонга.
В этой программе
присутствуют три вида примитивов, из которых строится сцена. Это полигон
(треугольник), эллипсоид и параболоид. Последние два введены для более
реалистичной имитации стакана (его можно было бы построить и из полигонов, но
модель получилась бы более грубая).
Вычисление нормали к
полигону (Треугольнику).
Вычисление нормали к
треугольнику сводится к операции векторного умножения. Пусть задан треугольник ABC координатами трех своих вершин: XA, YA, ZA, XB, YB, ZB, XC, YC, ZC.
Вычислим координаты двух векторов,
например AB и AC:
XAB = XB – XA, YAB =
XB – XA, ZAB = XB – XA, (7)
XAC
= XC – XA, YAC
= XC – XA, ZAC = XC – XA
Координаты вектора нормали будут
вычисляться по формулам:
Xn =
YABZAC - YACZAB, Yn = XABZAC - XACZAB, Zn = XABYAC - XACYAB (8)
Нет необходимости
вычислять координаты вектора нормали к треугольнику каждый раз в теле трассировки,
так как в любой точке треугольника нормали одинаковые. Достаточно их посчитать
один раз в инициализирующей части программы и сохранить. При повороте
треугольника надо поворачивать и его нормаль.
Вычисление нормали к
поверхности второго порядка.
Поверхность второго
порядка задается в общем случае уравнением вида:
Q(x,y,z) = a1x2 + a2y2 + a3z2
+ b1yz + b2xz + b3xy + c1x +c2y
+c3z + d =0 (29)
Но мы будем
использовать другую форму записи. Так уравнение сферы будет выглядеть следующим
образом:
(x-x0)2 + (y-y0)2 + (z-z0)2 = 1 (9)
где x0, y0, z0 –
координаты центра сферы.
Для вычисления
координат вектора нормали необходимо вычислить частные производные по x, y, z.
Координаты вектора
нормали сферы:
Xn
= 2(x-x0), Yn = 2(y-y0)
, Zn = 2(z-z0). (10)
Направление вектора не
изменится, если все его координаты разделить на 2:
Xn = (x-x0),
Yn = (y-y0),
(11)
Zn = (z-z0)
Нормаль для поверхности
второго порядка придется вычислять непосредственно в теле трассировки, так как
в разных точках фигуры нормали разные.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1
Авдеева
С.М., Куров А.В. Алгоритмы трехмерной машинной графики: учебное пособие. – М.:
Издательство МГТУ им. Н.Э.Баумана, 1996. – 60 с., ил.
2
Никулин Е.
А. Компьютерная геометрия и алгоритмы машинной графики. СПб.: БХВ-Петербург,
2003. – 560с.: ил.
3
Авдеева
С.М., Куров А.В. Алгоритмы трехмерной машинной графики: Учебное пособие. – М.:
Изд-во МГТУ им. Н.Э. Баумана, 1996. – 60 с.: ил.
4
Иванов В.П., Батраков А.С. Синтез изображений
объектов сложной формы методом трассирования лучей // Программирование.-1989.2.-С.
70-75.