Реалистические изображения Построение реалистических изображений является одной из основных задач компьютерной графики. При построении изображений какими-либо библиотеками (OpenGL, DirectX) возможна их недостаточность, так как в основном такие библиотеки предназначены для получения динамически меняющейся картинки и мельчайшая детализация имеет второстепенное значение. Для построения статических изображений высоко качества лучшим способом является метод трассировка лучей. Метод трассировки лучей Основная идея метода трассировки лучей состоит в исследовании поведения каждого луча, проходящего через каждую точку (пиксель) на экране. Каждый луч начинается из определенной точки (глаза), проходит через точку экрана и заканчивается на пересечении с объектом, в результате в каждой точке экрана формируется цвет, зависящий от освещения точки пересечения с объектом. Схематически это можно представить следующим рисунком: Алгоритм метода для каждой точки (пикселя) можно представить следующим образом: 1. Формирования луча, выходящего из глаза и проходящего через точку на экране, 2. Нахождение пересечений со всеми объектами, 3. Выбор ближайшего пересечения (определение ближайшего, то есть видимого пересечения), 4. Проверка на нахождении точки в тени от других объектов Формирование луча, направленного к источнику освещения, Если имеет место хотя бы одно пересечение с другими объектами, то точка находится в тени. 5. Определение нормали в точке, 6. Формирование цвета с учётом освещения, 7. Рисование пикселя Последовательно рассмотрим шаги данного алгоритма. Для определенности будем считать, что точка наблюдения находится в начале координат и проекция точки наблюдения на экран находится в середине. Формирование луча Найдем направляющий вектор луча из тех соображений, что луч проходит через начало координат и искомую точку на экране, причем известно также расстояние до экрана. Данные факты позволяют нам определить вектор следующим образом: d 1 P Py2 Pz2 2 x ( Px ; Py ; Pz ) , где Px , Py , Pz – координаты пикселя на экране. Тогда в параметрическом виде луч можно записать следующим образом: x d xt y d yt z d zt Нахождение пересечений с объектами Для простоты рассмотрим пересечение луча со сферой. Пусть сфера задана положением центра сферы и радиусом. Тогда неявное уравнение сферы можно записать следующим образом: ( x x0 ) 2 ( y y0 ) 2 ( z z 0 ) 2 R 2 , где x0 , y0 , z0 – координаты центра сферы, R – радиус сферы. Подставим параметрические уравнения прямой в уравнение сферы, получим: (d x t x0 ) 2 (d y t y0 ) 2 (d z t z0 ) 2 R 2 Преобразуем данное уравнение относительно t: d t d t d t t 2 2 x y 2 z 2 2t (d x x0 d y y0 d z z0 ) x02 y02 z02 R 2 0 Решая данное квадратное уравнение следует отметить следующее: 1. Если дискриминант меньше нуля, то точек пересечений со сферой нет, 2. Два решения данного квадратного уравнения свидетельствуют о двух пересечениях луча со сферой. Нахождение ближайшего пересечения После нахождения времени пересечения со всеми объектами необходимо определить видимую точку на луче. Данный алгоритм зависит от задания объектов, например при нахождении видимой точки объединения объектов следует выбирать наименьшее время пересечения: Формирование цвета точки Данный процесс наиболее сложный в методе трассировки лучей. Рассмотрим простейший способ определения цвета. Потребуем трассировку первичных лучей, а также учёт теней. Рассмотрим модель освещения Фонга. При нахождении видимой точки не составляет труда найти нормаль к поверхности, в случае сферы нормаль к поверхности есть нормированный вектор соединяющий видимую точку и центр сферы: Из курса физики известно, что угол падения луча равен углу отражения, таким образом, в реалистической модели вектор отраженного луча должен быть симметричен относительно нормали к поверхности: Полученный вектор есть вектор максимального отражения падающего луча и в зависимости от него исследуется интенсивность света. Этот способ исследования является самым реалистичным, но самым долгим в смысле вычислений, поэтому используется следующая схема определения интенсивности по направлению. В качестве вектора максимального отражения используется промежуточный вектор h s v Далее общая интенсивность складывается из фоновой, диффузионной и зеркальной составляющей. Зеркальная составляющая: С помощью данной составляющей можно реализовывать блики объекта, она определяет отраженный свет от объекта. Зеркальная составляющая определяется формулой: (h, v) I sp I s s h v f , где I s [0;1] – интенсивность источника s [0;1] – коэффициент зеркального отражения f [1;200] – степень гладкости зеркального отражения Диффузионная составляющая: С помощью данной составляющей формируется основной цвет освещенного объекта. Диффузионная составляющая определяется формулой: I d I s d (n, s) , где n s d [0;1] – коэффициент диффузной составляющей Фоновая составляющая: С помощью данной составляющей формируется освещение объекта естественным светом. В отличие от двух предыдущих, данная составляющая не зависит от наличия освещенности видимой точки, тем самым формируя освещение объекта окружающей средой. Фоновая составляющая определяется формулой: I amb I a a , где I a - интенсивность фонового света a - коэффициент фоновой составляющей света Следует отметить, что в компьютерной графике используется в основном комбинация синего, красного и зелёного цвета (модель RGB), поэтому необходимо определять интенсивность каждой составляющей цвета в отдельности. После нахождения составляющих общей интенсивности следует сложить все составляющие, причем в зависимости от наличия освещенности следует учитывать диффузную и зеркальную составляющую интенсивности: (h, v) ( s, n) I I a a I s d max , 0 I s s max h v s n f , 0 Далее цвет пиксела определяется как следующая комбинация: 255I R , 255IG , 255I B , где I R , I G , I B – общие интенсивности для каждой составляющей цвета. Учет теней Процесс учета теней состоит в проведении луча из видимой точки к источнику света и исследование данного луча на предмет пересечения с какими-либо объектами сцены. Возможные параметры В качестве примера коэффициентов для модели освещения Фонга приведем данные для серебра: Серебро Red Green Blue a 0.19225 0.19225 0.19225 d 0.50754 0.50754 0.50754 s 0.50827 0.50827 0.50827 Коэффициент f 51.2 Пример