Участник:Vlamakarenko/Трассировка лучей: различия между версиями
Строка 24: | Строка 24: | ||
Источники света задаются по-разному, в зависимости от способа распространения света от источника. Например, точечные источники света задаются положением в пространстве и интенсивностью, направленные - интенсивностью и вектором направления. | Источники света задаются по-разному, в зависимости от способа распространения света от источника. Например, точечные источники света задаются положением в пространстве и интенсивностью, направленные - интенсивностью и вектором направления. | ||
− | Камера задается положением в пространстве и ортонормированным базисом <math>(\overline{u}_c, \overline{v}_c, \overline{w}_c)</math> (локальная система координат). <math>\overline{u}_c</math> направлен вправо относительно наблюдателя, <math>\overline{v}_c</math> - вверх, <math>\overline{w}_c</math> - на наблюдателя. Таким образом, <math>(\overline{u}_c, \overline{v}_c, \overline{w}_c)</math> - правая тройка векторов. Вектор направления камеры в своей | + | Камера задается положением в пространстве и ортонормированным базисом <math>(\overline{u}_c, \overline{v}_c, \overline{w}_c)</math> (локальная система координат). <math>\overline{u}_c</math> направлен вправо относительно наблюдателя, <math>\overline{v}_c</math> - вверх, <math>\overline{w}_c</math> - на наблюдателя. Таким образом, <math>(\overline{u}_c, \overline{v}_c, \overline{w}_c)</math> - правая тройка векторов. Вектор направления камеры в своей системе координат: <math>(0, 0, -1)</math>. |
− | Перед камерой на расстоянии <math>d</math> поставим пиксельную сетку <math>w \times h</math> с размером пикселя <math>s \times s</math> так, чтобы камера была направлена в центр сетки. | + | === Генерация луча === |
+ | |||
+ | Перед камерой на расстоянии <math>d</math> поставим пиксельную сетку <math>w \times h</math> с размером пикселя <math>s \times s</math> так, чтобы камера была направлена в центр сетки. Итоговое изображение будет получено из этой сетки покраской пикселей в нужный цвет. | ||
+ | |||
+ | Пусть <math>p(i, j)</math>, где <math>i=\overline{0,h-1}, \,\,\, j=\overline{0,w-1}</math> - пиксел <math>i</math>-ой строки снизу <math>j</math>-го столбца слева. Проведем луч из камеры к центру пикселя в локальной системе координат камеры. Начало луча в точке <math>\overline{pos}=(0,0,0)</math>. | ||
+ | Найдем вектор направления <math>\overline{dir}</math>: | ||
+ | |||
+ | <math>\overline{dir}.x = s (j -\frac{w}{2} + \frac{1}{2}) </math> | ||
+ | |||
+ | <math>\overline{dir}.y = s (i -\frac{h}{2} + \frac{1}{2}) </math> | ||
+ | |||
+ | <math>\overline{dir}.z = d</math> | ||
+ | |||
+ | Нормируем вектор <math>\overline{dir}</math> и переведем луч в глобальную систему координат. | ||
+ | |||
+ | === Вычисление цвета пикселя === | ||
+ | |||
+ | Найдем пересечения луча с объектами сцены. Если луч не пересечет ни один объект, то покрасим пиксел в черный цвет (можно использовать сферическое изображение в качестве фона и покрасить пиксел должным образом). В противном случае найдем близжайшую точку и обозначим ее через <math>h(x,y,z)</math> | ||
− | |||
== Вычислительное ядро алгоритма == | == Вычислительное ядро алгоритма == |
Версия 17:52, 17 ноября 2016
авторы: В.А.Макаренко, Р.А.Габдуллин
Содержание
- 1 Свойства и структура алгоритма
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритма
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Локальность данных и вычислений
- 2.3 Возможные способы и особенности параллельной реализации алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Трассировка лучей - это технология визуализации трехмерных сцен путем отслеживания обратной траектории лучей света (от наблюдателя к источнику). Достоинствами данного метода являются реалистичность итоговых изображений, возможность визуализации гладких объектов без аппроксимации полигональными поверхностями, простота реализации отражений, преломлений, взятия в фокус, реалистичного освещения; возможность параллельной обработки лучей.
1.2 Математическое описание алгоритма
1.2.1 Входные данные
[math]scene = \{objects, lights, camera\}[/math] - сцена, которая будет визуализирована алгоритмом, где
[math]objects[/math] - множество объектов (например сфера, плоскость, треугольник, составной объект и т. п.).
[math]lights[/math] - множество источников света (точечные источники, направленные источники, светящиеся объекты)
[math]camera[/math] - камера наблюдения ("виртуальный глаз").
Объекты задаются произвольным образом так, чтобы можно было найти пересечение луча с этим объектом (например, для сферы достаточно задать положение в пространстве и радиус, а для плоскости - точку, принадлежащую ей и нормаль). Также, для каждого объекта необходимо задать материал - информацию о его отражающих, преломляющих, поглощающих свойствах.
Источники света задаются по-разному, в зависимости от способа распространения света от источника. Например, точечные источники света задаются положением в пространстве и интенсивностью, направленные - интенсивностью и вектором направления.
Камера задается положением в пространстве и ортонормированным базисом [math](\overline{u}_c, \overline{v}_c, \overline{w}_c)[/math] (локальная система координат). [math]\overline{u}_c[/math] направлен вправо относительно наблюдателя, [math]\overline{v}_c[/math] - вверх, [math]\overline{w}_c[/math] - на наблюдателя. Таким образом, [math](\overline{u}_c, \overline{v}_c, \overline{w}_c)[/math] - правая тройка векторов. Вектор направления камеры в своей системе координат: [math](0, 0, -1)[/math].
1.2.2 Генерация луча
Перед камерой на расстоянии [math]d[/math] поставим пиксельную сетку [math]w \times h[/math] с размером пикселя [math]s \times s[/math] так, чтобы камера была направлена в центр сетки. Итоговое изображение будет получено из этой сетки покраской пикселей в нужный цвет.
Пусть [math]p(i, j)[/math], где [math]i=\overline{0,h-1}, \,\,\, j=\overline{0,w-1}[/math] - пиксел [math]i[/math]-ой строки снизу [math]j[/math]-го столбца слева. Проведем луч из камеры к центру пикселя в локальной системе координат камеры. Начало луча в точке [math]\overline{pos}=(0,0,0)[/math]. Найдем вектор направления [math]\overline{dir}[/math]:
[math]\overline{dir}.x = s (j -\frac{w}{2} + \frac{1}{2}) [/math]
[math]\overline{dir}.y = s (i -\frac{h}{2} + \frac{1}{2}) [/math]
[math]\overline{dir}.z = d[/math]
Нормируем вектор [math]\overline{dir}[/math] и переведем луч в глобальную систему координат.
1.2.3 Вычисление цвета пикселя
Найдем пересечения луча с объектами сцены. Если луч не пересечет ни один объект, то покрасим пиксел в черный цвет (можно использовать сферическое изображение в качестве фона и покрасить пиксел должным образом). В противном случае найдем близжайшую точку и обозначим ее через [math]h(x,y,z)[/math]
1.3 Вычислительное ядро алгоритма
Основные вычисления связаны с:
1) поиском пересечения луча с объектами сцены
2) расчетом теней от каждого источника света (требуется определить, "виден" ли источник света из точки пересечения с объектом).