Курсовая работа: Построение реалистичного изображения методом обратной трассировки лучей
Требуется найти единичный вектор преломленного луча 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 = S1 N1 . Тогда мы можем записать такое выражение для вектора NT :
NT = -N1 √1+n2 ((S1 N1 )2 – 1).
Осталось найти выражение для вектора B. Он располагается на одной прямой с вектором A, причем A = S1 – NS . Учитывая, что NS равен N1 cos α1 , то A = S1 – N1 cos α1 . Так как cos α1 = S1 N1 , то A = S1 – N1 (S1 N1 ).
Поскольку длина вектора A равна sin α1 , а длина вектора B равна sin α2 ,
|B|/|A| = sin α2 / sin α1 = n2 /n1 = n,
откуда |B| = n |A|. Учитывая взаимное расположение векторов A и B, получим
B = –nA =n(N1 (S1 N1 ) – S1 ).
Теперь мы можем записать искомое выражение для единичного вектора луча преломления T1 :
Вычисление точки пересечения с примитивами
В алгоритме трассировки для построения изображения необходимо вычислять точки пересечения лучей с примитивами сцены. Луч задается параметрическим уравнением прямой. Любая точка луча удовлетворяет уравнению
R = A + Vt,
где R – радиус вектор произвольной точки, принадлежащей лучу, A – радиус- вектор начальной точки луча, V – направляющий вектор луча, t – параметр.Если направляющий вектор V нормализовать, то параметр t будет численно равен расстоянию от начальной точки луча A до точки R.
Можно записать это уравнение в координатном виде:
x = x1 + at,
y = y1 + bt,
z = z1 + ct.
Здесь x1, y1, z1 – координаты начальной точки луча в прямоугольной декартовой мировой системе координат, a,b,c – координаты направляющего вектора луча.
Вычисление точки пересечения луча с поверхностью второго порядка.
Для нахождения точки пересечения луча, заданного уравнениями (2) с поверхностью второго порядка, заданной уравнениями (2.2.2.3) или (2.2.2.4):
(x–x0 )2 /A2 + (y–y0 )2 /B2 + (z–z0 )2 /C2 = 1 (эллипсоид)
(x–x0 )2 /A2 + (y–y0 )2 /B2 – (z–z0 )2 /C2 = 1 (параболоид),
нужно подставить в уравнение поверхности второго порядка вместо x, y и z соответствующие уравнения луча. В результате этого после раскрытия всех скобок и приведения подобных мы получим квадратное уравнение относительно параметра t. Если дискриминант квадратного уравнения меньше нуля, то луч и поверхность второго порядка общих точек пересечения не имеют. В противном случае можно будет вычислить два значения параметра t. Дискриминант может быть равен нулю – это соответствует предельному случаю касания луча поверхности, и мы получим два совпадающих значения параметра t.
Для нахождения координат точек пересечения луча и поверхности достаточно подставить найденные значения параметра t в уравнения луча (2).
В программе при нахождении двух пересечений для визуализации выбирается ближнее из них. Ближнее пересечение определяется путем сравнения найденных параметров t. Ближе к точке наблюдения находится то пересечение, которому соответствует меньший параметр t. Тут надо заметить, что в результате решения квадратного уравнения одно или оба значения параметра t могут получиться отрицательными. Это означает, что точка пересечения лежит «сзади» относительно точки начала луча, на половине прямой, находящейся «по нашу сторону» относительно картинной плоскости. Такие точки при поиске пересечения отбрасываются.