в самое начало


demo.design
3D programming FAQ



РАЗНОЕ
7.8. Обратная трассировка лучей

Обратная трассировка лучей (она же рэйкастинг, raycasting) - простой, хотя и довольно медленный, метод получения высокореалистичных изображений. Этот метод часто путают с прямой трассировкой лучей (рэйтрэйсинг, raytracing), которая, на самом деле, практически никогда и никем не используется из-за своей редкостной неэффективности. Впрочем, эти два термина уже практически и не различают.

Итак, идея обратной трассировки лучей. Для определения цвета пиксела экрана через него из камеры проводится луч, ищется его ближайшее пересечение со сценой и определяется освещенность точки пересечения. Эта освещенность складывается из отраженной и преломленной энергий, непосредственно полученных от источников света, а также отраженной и преломленной энергий, идущих от других объектов сцены. После определения освещенности этой точки учитывается ослабление света при прохождении через прозрачный материал и в результате получается цвет точки экрана.

Для определения освещенности, привносимой непосредственным освещением, из точки пересечения выпускаются лучи ко всем источникам света и определяется вклад всех источников, которые не заслонены другими объектами сцены. Для определения отраженной и преломленной освещенности из точки выпускаются отраженный и преломленный лучи и определяется привносимая ими освещенность.

Непосредственное освещение от источника света считаем, например, по уравнению Фонга (см. п.5.1). На самом деле, компоненты diffuse и specular в этом уравнении для большей реалистичности с точки зрения физики надо разделить на квадрат расстояния до источника света, но обычно этим пренебрегают.

Ослабление света в прозрачной среде учитывается делением на коэффициент

k = exp(beta * l),

где

k

коэффициент ослабления

beta

коэффициент прозрачности среды

l

длина пути внутри среды

Наконец, преломляется луч света по следующему закону:

sin(b) = n1 * sin(a) / n2,

где

a

угол между падающим лучом L и нормалью N

b

угол между преломленным лучом L' и нормалью N

n1

коэффициент преломления среды, в которой проходит луч L

n2

коэффициент преломления среды, в которой проходит луч L'

Вот иллюстрация.

рисунок (illu/illu78a.gif)

Для воздуха считают beta = 0, n = 1; для всех остальных сред обычно beta > 0, n > 1. Надо отметить, что все эти коэффициенты (отражения, преломления, прозрачности) различны для каждой из трех цветовых компонент R, G, B. Еще надо отметить, что обычно объекты непрозрачны и поэтому преломлением пренебрегают.

Алгоритм работы функции трассировки луча с началом o = (ox,oy,oz) и направлением d = (dx,dy,dz), возвращающей, кстати, освещенность по всем трем цветовым компонентам, будет, таким образом, выглядеть примерно так:

  • ищем ближайшее пересечение луча со сценой (определяем точку p, где произошло пересечение, выясняем, с каким конкретно объектом оно произошло)

    • если не нашли, возвращаем 0

    • если пересечение есть, текущую освещенность полагаем равной фоновой освещенности (ambient)

  • определяем вектор n, нормаль к объекту в точке пересечения

  • для кажого (точечного) источника света

    • считаем вектор l, соединяющий источник и точку p (начало в p)

    • ищем пересечение луча с началом в точке p и направлением d со сценой

      • если нашли, прекращаем обработку этого источника, так как его не видно

    • считаем симметричный l относительно n вектор r

    • считаем по уравнению Фонга (оно использует n, l, r, d) освещенность в точке за счет этого источника света, добавляем ее к текущей

  • считаем симметричный d относительно n вектор refl, то есть отраженный вектор

  • трассируем отраженный луч (с началом p и направлением refl), добавляем полученную освещенность к текущей

  • считаем направление преломленного луча (вектор refr) по d, n и коэффициентам преломления

  • трассируем преломленный луч (с началом p и направлением refr), добавляем полученную освещенность к текущей

  • покомпонентно умножаем текущую освещенность на цвет объекта

  • если для материала, заполняющего пройденную лучом от o до p трассу beta != 0, умножаем текущую освещенность на коэффициент ослабления

  • возвращаем текущую освещенность

При стандартной камере, которая находится в (0,0,-dist), и ориентирована так, что пикселу экрана (sx,sy) соотвествует 3D-точка (sx-xSize/2, ySize/2-sy, 0), для получения цвета пиксела (sx,sy), очевидно, достаточно оттрассировать луч, положив при этом

ox = oy = dz = 0,
oz = -dist,
dx = sx - xSize / 2,
dy = ySize / 2 - sy.



 в самое начало


demo.design
3D programming FAQ