В связи с недостатками модели Уиттеда в этой программе предлагается следующая система вычисления интенсивности света в точке.
Интенсивность света складывается из интенсивности фоновой подсветки сцены, интенсивности диффузно отраженного света источников, интенсивности бликов от источников («локальные» характеристики освещенности), интенсивности зеркально отраженного луча и интенсивности преломленного луча, если таковые имеются.
Интенсивность фоновой подсветки (IA) задается некоторой константой.
Интенсивность диффузно отраженного света (ID) вычисляется по классическому «закону косинуса».
ID = IL cos α,
где IL – интенсивность источника света, α – угол между нормалью к поверхности и направлением на источник.
В случае освещения сцены несколькими источниками Id вычисляется для каждого из них и затем суммируются.
IDi =Σ ILi cos αi.
Интенсивность блика от источника (IS) вычисляется в соответствии с моделью Фонга.
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.
Дата: 2019-07-24, просмотров: 278.