РАЗНОЕ Обратная трассировка лучей (она же рэйкастинг, raycasting) - простой, хотя и довольно медленный, метод получения высокореалистичных изображений. Этот метод часто путают с прямой трассировкой лучей (рэйтрэйсинг, raytracing), которая, на самом деле, практически никогда и никем не используется из-за своей редкостной неэффективности. Впрочем, эти два термина уже практически и не различают. Итак, идея обратной трассировки лучей. Для определения цвета пиксела экрана через него из камеры проводится луч, ищется его ближайшее пересечение со сценой и определяется освещенность точки пересечения. Эта освещенность складывается из отраженной и преломленной энергий, непосредственно полученных от источников света, а также отраженной и преломленной энергий, идущих от других объектов сцены. После определения освещенности этой точки учитывается ослабление света при прохождении через прозрачный материал и в результате получается цвет точки экрана. Для определения освещенности, привносимой непосредственным освещением, из точки пересечения выпускаются лучи ко всем источникам света и определяется вклад всех источников, которые не заслонены другими объектами сцены. Для определения отраженной и преломленной освещенности из точки выпускаются отраженный и преломленный лучи и определяется привносимая ими освещенность. Непосредственное освещение от источника света считаем, например, по уравнению Фонга (см. п.5.1). На самом деле, компоненты diffuse и specular в этом уравнении для большей реалистичности с точки зрения физики надо разделить на квадрат расстояния до источника света, но обычно этим пренебрегают. Ослабление света в прозрачной среде учитывается делением на коэффициент k = exp(beta * l), где
Наконец, преломляется луч света по следующему закону: sin(b) = n1 * sin(a) / n2, где
Вот иллюстрация. Для воздуха считают beta = 0, n = 1; для всех остальных сред обычно beta > 0, n > 1. Надо отметить, что все эти коэффициенты (отражения, преломления, прозрачности) различны для каждой из трех цветовых компонент R, G, B. Еще надо отметить, что обычно объекты непрозрачны и поэтому преломлением пренебрегают. Алгоритм работы функции трассировки луча с началом o = (ox,oy,oz) и направлением d = (dx,dy,dz), возвращающей, кстати, освещенность по всем трем цветовым компонентам, будет, таким образом, выглядеть примерно так:
При стандартной камере, которая находится в (0,0,-dist), и ориентирована так, что пикселу экрана (sx,sy) соотвествует 3D-точка (sx-xSize/2, ySize/2-sy, 0), для получения цвета пиксела (sx,sy), очевидно, достаточно оттрассировать луч, положив при этом ox = oy = dz = 0, |
|