Одним из методов визуализации (рендеринга) в компьютерной графике является метод «бросания лучей» (ray casting), при котором растровое изображение строится на основе замеров пересечения лучей с визуализируемой поверхностью в пространстве. Этот термин впервые использовался в компьютерной графике в 1982 году в работе Скотта Рота [1], который применил его для описания метода рендеринга CSG-моделей.
Первый алгоритм рейкастинга, используемый для рендеринга, был представлен Артуром Аппелем в 1968 году [2]. В основе рейкастинга лежит идея генерировать лучи из точки наблюдения сцены, один луч на пиксель, и находить самый близкий объект, который блокирует путь распространения этого луча. Используя свойства материала и эффект света в сцене, алгоритм рейкастинга может определить затенение данного объекта.
В реальной природе источник света испускает луч света, который, проходя через пространство, пересекает какую-либо преграду, которая прерывает распространение этого светового луча. В любой точке пути с лучом света может случиться любая комбинация трех процессов: поглощение, отражение и преломление. Некоторые из лучей, сгенерированных источником света, распространяются по пространству и в конечном счете попадают на область просмотра.
Алгоритм трассировки лучей (ray tracing) применяет рейкастинг для расчета первичных пересечений луча с объектами сцены и дополняет его генерацией дополнительных лучей для формирования световых бликов, теней, отражений, тем самым повышая уровень фотореалистичности изображения.
Для реализации алгоритма трассировки лучей и получения результирующего изображения сцены, состоящей из геометрических примитивов в пространстве R3, понадобятся следующие программные модели:
? модель луча в трехмерном декартовом пространстве;
? модель лучевого эмиттера (камера);
? математические модели графических примитивов;
? модель точечного источника света.
Рис. 1. Принцип построения изображения. Механизм упрощенной камеры-обскуры [3]
Для построения первичного луча и определения первых пересечений с объектами сцены вводятся понятия источника лучей и плоской области обзора. В основе модели лучевого эмиттера лежит механизм упрощенной камеры-обскуры (рис. 1) с бесконечно малым отверстием, через которое свет проникает на область обзора.
Определим плоскую область обзора как массив пикселей {n?m}, где n и m – количество пикселей в ширину и высоту соответственно, используя предварительно подготовленные структуры данных.
Установим начало координат в точку O(xo, yo, zo), центр камеры в точку C(xc, yc, zc). Зададим фокусный центр камеры точкой F(xF, yF, zF). Вектор определяет направление камеры.
Для корректного определения направления распространения луча от позиции камеры к центру каждого пикселя плоской области обзора понадобится сформировать ортогональный базис при помощи операций векторного произведения:
(1)
(2)
Направление первичного луча (рис. 2) определяется по следующим формулам:
(3)
(4)
(5)
где ?, ? – величины смещения луча по осям X, Y области обзора; i, j – целочисленные координаты пикселя, для которого генерируется луч; fovx, fovy – горизонтальный и вертикальный углы обзора камеры.
Рис. 2. Вычисление направления распространения луча от позиции камеры к центру каждого пикселя координатной плоскости
Пусть
Таким образом, можно записать векторное уравнение пучка лучей, исходящих из точки O с направляющими векторами :
t ? 0, (6)
где t – расстояние от начала луча до любой точки на нем; – вектор направления распространения луча.
Ниже приведены алгоритмы определения пересечений со следующими объектами, которые используются в демонстрационном приложении: плоскость и сфера.
Рассмотрим векторное уравнение плоскости, проходящей через фиксированную точку Q перпендикулярно вектору нормали :
(7)
где P(xP, yP, zP) – произвольная точка плоскости.
Решение системы уравнений (6), (7)
определяет значение параметра t, соответствующего точке пересечения луча с плоскостью:
(8)
Если t < 0, плоскость располагается позади камеры и луч ее не пересекает. Если t ? 0, точка пересечения находится на расстоянии от центра расположения лучевого эмиттера. Если , то луч проходит параллельно плоскости и не пересекает ее.
Аналогично решается задача о пересечении луча и сферы радиуса R с центром в точке Qs(xs, ys, zs):
(9)
[1] Плоскость: точка (0, ?1, 0), вектор нормали (0, 1, 0); сфера: точка (0, 0, 0), единичный радиус; источник света: точка (?7, 10, ?10).
[2] Цвета покомпонентно, нормировано в цветовой модели RGB: коричневый (0,5; 0,25; 0,25), зеленый (0,5; 1,0; 0,5), белый (1,0; 1,0; 1,0).