S = IL cosp β,
где IL – интенсивность источника света (0<=IL<=1), β – угол между отраженным лучом от источника света и направлением на точку, в которой расположена камера (центр проекции), p – некоторая степень от 1 до 200 –влияет на размытость блика. При маленьких значениях p блик более размытый.
Как и при вычислении ID в случае освещения сцены несколькими источниками IS вычисляется отдельно для каждого источника, а затем результаты суммируются.
Si =Σ ILi cosp β i.
Интенсивности зеркально отраженного (IR) и преломленного (IT) света рассчитываются для отраженного и преломленного лучей на следующем шаге рекурсии. Если достигнут предел глубины рекурсии, то эти интенсивности берутся нулевыми. От интенсивности IR берется r процентов, а от IT – t = 1 – r (см. предыдущий раздел).
Кроме того, вводятся следующие коэффициенты: KD – коэффициент диффузного отражения поверхности, KS – коэффициент блика.
KD – этот коэффициент является характеристикой неровности отражающей поверхности. Чем больше неровность поверхности, тем меньше света отражается от неё зеркально и меньше света она пропускает, и соответственно больше света она отражает диффузно. 0 <= KD <= 1.
При KD = 0 - весь свет, падающий на поверхность, отражается и преломляется. KD = 1 - весь свет отражается диффузно. На этот коэффициент умножаются интенсивность диффузно отраженного света и интенсивность фоновой подсветки. Интенсивности зеркально отраженного и преломленного света умножаются на (1 – KD).
KS – этот коэффициент отвечает за яркость блика от источника. 0<=KS<=1. При KS = 0 - блик не виден, при KS = 1 – яркость блика максимальна.
Таким образом, окончательная формула для расчета интенсивности объекта в какой-либо точке будет выглядеть следующим образом:
I = IAKD + Σ(ILiKDcos αi + ILiKScosp β i) + (1 – KD )(IRr + IT(1 – r)).
При этом надо заметить, что итоговая интенсивность не должна получиться больше единицы. Если такое происходит, то эта точка изображения будет засвеченной. Ее интенсивность надо сбросить на единицу.
Для получения цветного изображения необходимо провести расчеты отдельно для красной, зеленой и синей компоненты света. Цвет пиксела изображения будет вычисляться путем умножения каждой компоненты интенсивности на число, определяющее максимальное количество градаций интенсивности изображения. Для 32-битного изображения оно равно 255 на каждый из цветов(R,G,B).
R = 255*IR,
G = 255*IG,
B = 255*IB.
Здесь IR (не путать с интенсивностью зеркально отраженного света), IG, IB – интенсивности трех компонент света в точке, полученная по формуле, указанной выше.
Коэффициенты KD, KS, p – это индивидуальные характеристики объекта, отражающие его свойства. Кроме этого имеется еще один коэффициент – абсолютный показатель преломления n. n = c / v, где c – скорость света в вакууме, v – скорость света в среде (внутри объекта). Для абсолютно непрозрачных тел этот коэффициент равен ∞ (т.к. скорость света внутри тела нулевая). В программе для задания абсолютно непрозрачного тела необходимо поставить этот коэффициент >> 1 (порядка 10 000). При этом доля зеркально отраженного света r будет стремиться к единице, а преломленного, соответственно, к нулю.
Вычисление нормалей
В алгоритме трассировки нормали к объектам необходимы для вычисления отраженного и преломленного лучей, а также для определения освещенности согласно модели Фонга.
В этой программе присутствуют три вида примитивов, из которых строится сцена. Это полигон (треугольник), эллипсоид и параболоид. Последние два введены для более реалистичной имитации стакана (его можно было бы построить и из полигонов, но модель получилась бы более грубая).
Вычисление нормали к полигону (Треугольнику).
Вычисление нормали к треугольнику сводится к операции векторного умножения. Пусть задан треугольник ABC координатами трех своих вершин: XA, YA, ZA, XB, YB, ZB, XC, YC, ZC.
Вычислим координаты двух векторов, например AB и AC:
XAB = XB – XA,
YAB = XB – XA,
ZAB = XB – XA,
XAC = XC – XA,
YAC = XC – XA,
ZAC = XC – XA.
Координаты вектора нормали будут вычисляться по формулам:
Xn = YABZAC - YACZAB,
Yn = XABZAC - XACZAB,
Zn = XABYAC - XACYAB.
Нет необходимости вычислять координаты вектора нормали к треугольнику каждый раз в теле трассировки, так как в любой точке треугольника нормали одинаковые. Достаточно их посчитать один раз в инициализирующей части программы и сохранить. При повороте треугольника надо поворачивать и его нормаль.
Вычисление нормали к поверхности второго порядка.
Поверхность второго порядка задается в общем случае уравнением вида: Q(x,y,z) = a1x2 + a2y2 + a3z2 + b1yz + b2xz + b3xy + c1x +c2y +c3z + d =0.
Но мы будем использовать другую форму записи. Так уравнение эллипсоида будет выглядеть следующим образом:
(x-x0)2/A2 + (y-y0)2/B2 + (z-z0)2 /C2 = 1,
где x0, y0, z0 – координаты центра эллипсоида, A, B, C – длины полуосей эллипсоида. Уравнение параболоида:
(x-x0)2/A2 + (y-y0)2/B2 - (z-z0)2 /C2 = 1,
где x0, y0, z0 – координаты центра параболоида, A, B, C – длины полуосей параболоида. Ось параболоида расположена вдоль оси Oz мировой системы координат.
Для вычисления координат вектора нормали необходимо вычислить частные производные по x, y, z.
Координаты вектора нормали эллипсоида:
Xn = 2(x-x0)/A2,
Yn = 2(y-y0)/B2,
Zn = 2(z-z0)/С2.
Направление вектора не изменится, если все его координаты разделить на 2:
Xn = (x-x0)/A2,
Yn = (y-y0)/B2,
Zn = (z-z0)/С2.
Координаты вектора нормали параболоида вычисляются аналогично:
Xn = (x-x0)/A2,
Yn = (y-y0)/B2,
Zn = – (z-z0)/С2.
Нормаль для поверхности второго порядка придется вычислять непосредственно в теле трассировки, так как в разных точках фигуры нормали разные.
Пусть задан вектор падающего луча S, а также известен вектор нормали N. Требуется найти вектор отраженного луча R.
Рассмотрим единичные векторы R1, S1и N1. Поскольку векторы нормали, падающего луча и отраженного луча находятся в одной плоскости, то можно записать R1 + S1 = N`, где N` - это вектор, соответствующий диагонали ромба и совпадающий по направлению с нормалью. Длина вектора N` равна 2cosθ. Так как вектор N` по направлению совпадает с N1, то
N` = N`2cosθ.
Отсюда найдем единичный вектор отраженного луча:
R1 = N1 2cosθ – S1 = N/|N| 2cosθ – S/|S|.
Найдем cosθ. Это можно сделать, используя скалярное произведение векторов N и S:
cosθ = N*S/(|N|*|S|).
Полагая, что искомый вектор отраженного луча будет иметь такую же длину, что и вектор падающего луча, то есть R = |S| R1, получим
R = N 2NS/|N|2 – S.
Это решение в векторной форме. Запишем координаты вектора:
xR = 2xN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) – xS,
yR = 2yN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) – yS,
zR = 2zN(xNxS+yNyS+zNzS)/(xN2+yN2+zN2) – zS.
Пусть даны два единичных вектора: S1 – вектор падающего луча, и N1 – вектор нормали к границе раздела двух сред. Также должны быть известны два коэффициента преломления для данных сред – n1 и n2 (или их отношение).
Требуется найти единичный вектор преломленного луча T1. Для решения выполним некоторые геометрические построения.
Искомый вектор T1 равен сумме двух векторов:
T1 = NT + B.
Найдем вначале вектор NT. Он противоположен по направлению вектору нормали, а его длина равна |T1| cos α2 = cos α2 (поскольку T1 – единичный). Таким образом, NT = -N1 cos α2. Необходимо определить cos α2. Запишем закон преломления n1 sin α1 = n2 sin α2 в виде:
sin α2 = n sin α1,
где n = n1 / n2.
Воспользуемся тождеством cos2α + sin2α = 1. Значение cos α1 можно выразить через скалярное произведение единичных векторов S1 и N1, то есть cos α1 = S1N1. Тогда мы можем записать такое выражение для вектора NT:
NT = -N1√1+n2((S1N1)2 – 1).
Осталось найти выражение для вектора B. Он располагается на одной прямой с вектором A, причем A = S1 – NS. Учитывая, что NS равен N1 cos α1, то A = S1 – N1 cos α1. Так как cos α1 = S1N1, то A = S1 – N1 (S1N1).
Поскольку длина вектора A равна sin α1, а длина вектора B равна sin α2,
|B|/|A| = sin α2/ sin α1 = n2/n1 = n,
откуда |B| = n |A|. Учитывая взаимное расположение векторов A и B, получим
B = –nA =n(N1(S1N1) – S1).
Теперь мы можем записать искомое выражение для единичного вектора луча преломления T1: