48755 (Реализация алгоритма обратной трассировки лучей для моделей с большим числом полигонов), страница 2
Описание файла
Документ из архива "Реализация алгоритма обратной трассировки лучей для моделей с большим числом полигонов", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48755"
Текст 2 страницы из документа "48755"
Если объект прозрачный, то необходимо построить вторичный луч такой, чтобы при преломлении он давал исходный луч. Некоторые тела могут, обладать свойством диффузного преломления. При этом образуется не один, а множество преломленных лучей. Как и в случае отражения, я этим пренебрегаю.
Таким образом, первичный луч, найдя пересечение с объектом, делится в общем случае на два луча (отраженный и преломленный). Далее эти два луча делятся еще на два и так далее.
Рис 1.
Главной процедурой обратной трассировки лучей в моей программе является процедура Ray. Она имеет следующую структуру:
Если поколение луча равно максимальной глубине рекурсии, то возвращаем среднюю яркость по всем составляющим. Если нет, то идем дальше
Определяем ближайший треугольник, с которым пересекается луч.
Если такого треугольника нет, возвращаем цвет фона, если есть, идем дальше.
Если поверхность, с которой было найдено пересечение, отражает, то формируем отраженный луч и вызываем рекурсивно процедуру Ray с поколением луча, увеличенным на 1.
Если поверхность, с которой было найдено пересечение, преломляет, то формируем преломленный луч и вызываем рекурсивно процедуру Ray с поколением луча, увеличенным на 1.
Определяем итоговую освещенность пиксела, учитывая расположение источников, свойства материала, а так же интенсивности отраженного и преломленного луча.
Я уже рассмотрели ряд ограничений метода трассировки, когда говорили о диффузном преломлении и о неровном зеркале. Рассмотрим и некоторые другие.
Освещать сцену могут только специальные объекты - источники света. Они точечные и не могут поглощать, преломлять и отражать свет.
Свойства отражающей поверхности состоят из двух компонент - диффузной и зеркальной.
При диффузном отражении учитываются только лучи от источников света. Если источник освещает точку, через зеркало (зайчиком), то считается, что точка не освещена.
Зеркальность тоже делится на две составляющие.
reflection - учитывает отражение от других объектов (не источников света)
specular - учитывает блики от источников света
В трассировке не учитываются зависимости от длины волны света:
коэффициента преломления
коэффициента поглощения
коэффициента отражения
Так как я не моделирую диффузное отражение и преломление, то не смогу получить фоновую подсветку. Поэтому вводим минимальную фоновую освещенность. Часто она позволяет просто значительно улучшить качество изображения.
Алгоритм трассировки позволяет рисовать очень качественные тени. Это не потребует большой переделки алгоритма. В него придется кое-что добавить. При расчете освещенности точки необходимо пустить в каждый из источников света "Теневой фронт". "Теневой фронт" - это луч, с помощью которого проверяется, лежит ли что-нибудь между точкой и источником. Если между ними лежит непрозрачный объект, то точка находится в тени. Это значит, что данный источник, не делает свой вклад в итоговую освещенность точки. Если лежит прозрачный объект, то интенсивность источника уменьшается. Прорисовка теней является очень затратной по времени. Так что, в некоторых ситуациях их отключают.
В моей программе есть возможность включить сглаживание изображения. Сглаживание заключается в том, что для определения цвета пиксела. пускается не один луч, а четыре и определяется среднее значение цвета у этих лучей. Если необходимо найти цвет пиксела (i,j), то пускаются 4 луча в точки экранной плоскости с координатами (i-0.25,j-0.25), (i-0.25,j+0.25), (i+0.25,j-0.25), (i+0.25,j+0.25).
2.3.2 Математическая основа обратной трассировки лучей
Координаты всех объектов сцены определены в некой глобальной системе координат (в том числе и камеры). После формирования первичного луча создадим подсистему, у которой центр совпадает с точкой выхода луча и ось OZ направлена по лучу. Вычислим матрицу перехода из первой системы координат во вторую. Это позволит просто искать пересечения с треугольником, со сферой, векторы преломления и отражения. При необходимости переводим координаты нужных объектов в новую систему координат и работаем уже в ней. Если необходимо построить вторичный луч, создаем еще одну систему координат, связанную с вторичным лучом, и считаем матрицу для перехода из 2 системы в 3. Чтобы получить матрицу перехода из 1 в 3 необходимо умножить матрицу перехода из 2 в 3 умножить на матрицу перехода из 1 в 2. Таким образом, мы работаем все время в какой-то подсистеме. Нам не надо переводить никакие координаты обратно в глобальную систему. Поэтому не надо и составлять обратную матрицу.
2.3.3 Составление матрицы
Составление матрицы преобразования из текущей системы координат в систему координат, центр которой находится в точке (x, y, z) и ось OZ которой направлена по (dx, dy, dz). Для такого преобразования необходимо:
совершить сдвиг в точку (x, y, z)
совершить поворот вокруг OZ
совершить поворот вокруг OX
1. Матрица сдвига: .
2. Необходимо совершить поворот вокруг оси OZ по часовой стрелке на угол α.
.
Матрица поворота, таким образом, будет равна:
3. Необходимо совершить поворот вокруг оси OX по часовой стрелке на угол β.
.
Матрица поворота, таким образом, будет равна:
Умножив M3 на M2, а результат на M1 получим искомую матрицу перехода:
2.3.4 Программная реализация
Во многих функциях и процедурах в программе в качестве входных и выходных параметров выступают матрицы. Поэтому в программе введен специальный тип:
TMatrix=Array [0. .11] of real
Это массив из 12 элементов типа real. Он представляет собой последовательно записанные три верхние строчки матрицы. Я не включил последнюю строчку, так как она одинаковая у всех матриц преобразования и равна (0, 0, 0,1).
Для операций над матрицами в программе предусмотрены следующие процедуры:
1. Procedure MatrixAB (var Res: TMatrix; const M1,M2: TMatrix)
Процедура умножает матрицу M1 на матрицу M2 и помещает результат в Res.
2. Procedure ShiftMatrix (var M: TMatrix; Z: real)
Создает матрицу перехода из текущей системы координат в систему координат, сдвинутую по оси OZ на z.
Процедура перемещает систему координат, задаваемую матрицей M, по оси OZ на z.
3. Procedure SetMatrix (var M: TMatrix; dx,dy,dz,x,y,z: real) overload
Создает матрицу перехода из текущей системы координат в систему координат, находящуюся в точке (x,y,z), ось OZ которой направлена по вектору (dx,dy,dz).
4. Procedure SetMatrix (var M: TMatrix; dx,dy,dz: real) overload
Создает матрицу перехода из текущей системы координат в систему координат, ось OZ которой направлена по вектору (dx,dy,dz).
Преобразование координат
Для преобразования координат точки из одной системы координат в другую необходимо умножить матрицу преобразования на столбец координат точки.
Для преобразования точки из одной системы координат в другую в программе существует процедура Trans (const M: TMatrix; var F: TPoint; const V: TPoint).
В V содержатся координаты точки, координаты которой надо преобразовать.
В F содержатся результат.
M - матрица преобразования.
В процедуру Ray передается только матрица перехода из глобальной системы координат в систему, связанную с лучом (Mi).
Процедура находит координаты вторичного луча в новой системе координат.
Составляет матрицу перехода из текущей системы в систему, связанную с лучом (Li+1).
Умножает матрицы Mi+1=Li+1Mi
Вызывает рекурсивно Ray с параметром Mi+1
2.3.5 Определение пересечения луча с треугольником
Преобразуем все вершины треугольника в локальную систему координат, связанную с лучом. Луч в этой системе координат имеет координаты (0, 0,1). После этого задача сводится плоской. Необходимо определить, лежит ли точка (0, 0) внутри треугольника в проекции на плоскость OXY.
Преобразуем координату x вершин треугольника в локальную систему координат.
Проверяем, лежат ли точки треугольника все справа от нуля или все слева. Если да, то пересечения с треугольником нет. Если нет, то:
Преобразуем координату у вершин треугольника в локальную систему координат.
Проверяем, лежат ли точки треугольника все сверху от нуля или все снизу. Если да, то пересечения с треугольником нет. Если нет, то:
Необходимо, чтобы при обходе треугольника по часовой стрелке точка (0,0) лежала справа от каждой стороны (либо наоборот). Это можно установить, проверив одного ли знака три векторных произведения:
, , .
Если не одного знака, то пересечения нет, Если одного, то:
Преобразуем координату z вершин треугольника в локальную систему координат.
Определяем нормаль к треугольнику, для этого умножим векторно два вектора
и
В случае если, NZ равно нулю, луч параллелен оси OZ и соответственно лучу. Значит, пересечения нет. В другом случае пересечение есть.
Находим координаты пересечения.
Составим уравнение плоскости, в которой находится треугольник:
,
подставим x=0 и y=0,
2.3.4 Формирование отраженного луча
Обозначим отраженный луч через R, вектор, направленный против падающего луча - S, вектор нормали - N. Рассмотрим единичные векторы этих векторов R1, S1, N1. Так как все три вектора находятся в одной плоскости, то можно записать R1+S1=N’. Длина вектора N’ равна 2cosθ. Так как векторы N’ и N1 сонаправленные, то можно записать:
N’=N12cosθ.
Таким образом
.
Поставим условие, что падающий и отраженный лучи имеют одинаковую длину.
Так как падающий луч в локальной системе координат имеет координаты (0, 0,1). То вектор S будет иметь координаты (0, 0, - 1). Подставим его координаты в выражение для отраженного луча. Получим
2.3.5 Формирование преломленного луча
Обозначим преломленный луч, имеющий единичную длину, через T1. Единичный вектор нормали - через N1. А вектор, направленный противоположно падающему лучу - через S1. Разложим вектор S1 на A и Ns, а вектор T1 на B и NT. Вектор равен