В силу того, что при написании программы использовалась технология объектно-ориентированного программирования, особое внимание при рассмотрении ее структуры должно быть уделено структуре ее классов. В программе классы созданы для различных целей: для представления математических абстракций (точка, вектор, плоскость, луч, примитив), описания примитивов и объектов (сфера, кольцо, поверхность), задания свойств объектов (источник света, поверхность), отрисовки и инициализации объектов сцены (сцена, прорисовка):
· Class vector3 – математическая абстракция точки в трёхмерном пространстве (а также вектора с тремя координатами, которым удобно задавать интенсивность и цвет луча или точки поверхности). Содержит всевозможные переопределения операторов для класса vector3, а также методы по заданию и считыванию координат, нахождению длины вектора, а также скалярного произведения векторов;
· Class plane – математическая абстракция плоскости, содержит метод по заданию плоскости на основе нормали;
· Class surface – класс-абстракция для работы с пиксельным изображением;
· Class Ray – математическая абстракция луча. Содержит поля, определяющие точку, из которой исходит луч, и его направление. Методы служат для задания и считатывания начальной точки и направления луч;
· Class Material – класс, отвечающий за все возможные свойства поверхности объекта: цвет, составляющие отражения и т.д. Содержит различные методы по заданию и получению свойств, а также по заданию и распределению текстуры по поверхности;
· Class Primitive – математическая абстракция примитива. В программе используются три вида примитивов, это сфера, кольцо и плоскость. Поля класса отвечают за уникальное название примитива; за материал, из которого он сделан; за то, является ли примитив источником света и за луч, который пересекается с примитивом. Методы класса по большей части объявлены как виртуальные, т.к. впоследствии переопределяются для каждого класса-наследника, отвечающего за определённый тип примитива. Также в классе предусмотрены методы проверки на соответствие примитива источнику света, задания и считывания материала имени примитива, получения последнего пересечения с лучом и преобразования примитива в источник света;
· Class Sphere – наследник класса primitive, отвечающий за примитив сферу. Сфера задаётся параметрически, при помощи задания центра и радиуса. Предусмотрены методы получения цвета, подсчёта нормали, считывания радиуса и проверки на пересечение луча со сферой;
· Class PlanePrim - наследник класса primitive, отвечающий за примитив плоскость. Плоскость задаётся параметрически при помощи двух пересекающихся векторов. Предусмотрены методы получения цвета, подсчёта нормали и проверки на пересечение луча с плоскостью;
· Class Ring - наследник класса primitive, отвечающий за примитив кольцо. Кольцо обладает рядом свойств, задающих его параметры – плоскость кольца (плоскость задаётся двумя векторами), толщина кольца (задаётся двумя радиусами) и центр кольца, от которого берутся радиусы. Предусмотрены методы получения цвета, подсчёта нормали и проверки на пересечение луча с кольцом;
· Class Scene – класс, отвечающий за инициализацию объектов сцены. Содержит массив примитивов, и их контрольную сумму. Методы класса служат для получения количества примитивов, инициализации сцены и получения указателя на примитив,попавший в данный участок разбиения;
· Class Engine – опорный класс, отвечающий за разбиение сцены на абстрактные участки, запуск алгоритма обратной трассировки лучей и отрисовку объектов сцены. Поля класса содержат данные для отрисовщика, сцену, модель наблюдателя, экрана, и его параметры. Методы служат для получения сцены, запуска и отслеживания состояния алгоритма обратной трассировки, инициализации и получения буферизованного изображения.
Таким образом, дерево классов программы представляет собой иерархическую структуру, с реализацией наследования.
Выводы:
Разработанная программа позволяет получать на экране растрового дисплея реалистичное изображение сцены, представляющей из себя увеличенную модель атома лития. Результат работы программы можно увидеть в приложении 1. Благодаря алгоритму обратной трассировки лучей и глобальной модели освещенности Уиттеда, удалось добиться высокой реалистичности полученного изображения. Листинг программы можно увидеть в приложении 2.
По результатам работы программы были сделаны выводы:
· Алгоритм обратной трассировки лучей обеспечивает высокую степень реалистичности изображения, при невысокой скорости выполнения;
· Без дополнительной оптимизации увеличение числа объектов сцены ведет к значительному увеличению времени построения;
· При существующем движке трассировки лучей сцена создается и дополняется новыми объектами достаточно просто.
Список использованной литературы
1. Роджерс Д. Алгоритмические основы машинной графики / Пер. с англ. –М.:Мир, 1989. – 512 с.,ил.
2. Авдеева С.М., Куров А.В. Алгоритмы трехмерной машинной графики: учебное пособие. – М.: Издательство МГТУ им. Н.Э.Баумана, 1996. – 60 с., ил.
3. Шикин Е.В., Боресков А.В. Компьютерная графика. Динамика, реалистические изображения. – М.: Диалог-МИФИ, 1995. – 288 с.
4. Владимир Фролов, Александр Фролов. Тени. URL: https://ray-tracing.ru
Приложения