Курсовая работа: Построение реалистичного изображения методом обратной трассировки лучей
При этом надо заметить, что итоговая интенсивность не должна получиться больше единицы. Если такое происходит, то эта точка изображения будет засвеченной. Ее интенсивность надо сбросить на единицу.
Для получения цветного изображения необходимо провести расчеты отдельно для красной, зеленой и синей компоненты света. Цвет пиксела изображения будет вычисляться путем умножения каждой компоненты интенсивности на число, определяющее максимальное количество градаций интенсивности изображения. Для 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 = YAB ZAC - YAC ZAB ,
Yn = XAB ZAC - XAC ZAB ,
Zn = XAB YAC - XAC YAB .
Нет необходимости вычислять координаты вектора нормали к треугольнику каждый раз в теле трассировки, так как в любой точке треугольника нормали одинаковые. Достаточно их посчитать один раз в инициализирующей части программы и сохранить. При повороте треугольника надо поворачивать и его нормаль.
Вычисление нормали к поверхности второго порядка.
Поверхность второго порядка задается в общем случае уравнением вида: Q(x,y,z) = a1 x2 + a2 y2 + a3 z2 + b1 yz + b2 xz + b3 xy + c1 x +c2 y +c3 z + d =0.
Но мы будем использовать другую форму записи. Так уравнение эллипсоида будет выглядеть следующим образом:
(x-x0 )2 /A2 + (y-y0 )2 /B2 + (z-z0 )2 /C2 = 1,
где x0 , y0 , z0 – координаты центра эллипсоида, A, B, C – длины полуосей эллипсоида. Уравнение параболоида: