В качестве среды разработки была выбрана MicrosoftVisualStudio 6.0:
· Для этой среды есть специальный компилятор фирмы Intel, который поддерживает очень мощную оптимизацию программы для процессоров вплоть до Pentium 4, что позволило резко повысить быстродействие программы.
· При разработке программы использовались библиотеки классов MFC (MicrosoftFoundationClasses), поставляемые вместе со средой разработки, которые позволяют существенно упростить разработку интерфейса программы по сравнению с использованием стандартных функций WindowsAPI.
· Данная среда обладает удобным редактором кода и отладчиком, предоставляющими большое количество функций, необходимых для эффективного написания исходного кода и локализации и устранения ошибок в программе.
В силу того, что при написании программы использовалась технология объектно-ориентированного программирования, особое внимание при рассмотрении ее структуры должно быть уделено структуре ее классов.
Условно все классы, присутствующие в программе, можно разделить на несколько частей по выполняемым функциям:
· Математические абстракции
· Вспомогательные классы свойств трехмерных объектов
· Базовые трехмерные объекты
· Источник света
· Сцена
· Алгоритмы визуализации
· Интерфейс пользователя
3.2.1 Математические абстракции
Математические абстракции в программе представлены тремя классами:
1. CVector – трехмерный вектор и операции над ним. Реализованы операции умножения на вектор, умножения на матрицу, умножения и деления на число, нахождение скалярного и векторного произведения, нормализации, определение длины. Некоторые операции продублированы операторами для удобства записи, а также введены операторы действий, совмещенных с присваиванием.
2. CMatrix – двумерная матрица 4х4, используемая в программе для задания трехмерных преобразований. Среди реализованных операций: умножение и деление на число, умножение на вектор и на другую матрицу, нахождение обратной и транспонированной матрицы. В класс матрицы включены статические методы, возвращающие матрицы преобразований: поворота, сдвига и масштабирования.
3. CRay – трехмерный луч, задающийся двумя трехмерными векторами: точкой испускания и направлением. Помимо стандартных методов-аксессоров обладает методом сдвига на заданную величину в направлении своего хода, что активно применяется в ходе выполнения алгоритма обратной трассировки лучей.
3.2.2 Вспомогательные классы свойств трехмерных объектов
Одним из основных классов, задающих внешний вид трехмерного объекта, является класс CSurface, среди атрибутов которого присутствуют следующие величины:
· Коэффициент фоновой освещенности
· Коэффициент диффузного отражения
· Коэффициент зеркального отражения
· Коэффициент Фонга (характеризует пространственное распределение зеркально отраженного света)
· Коэффициент прозрачности
· Коэффициент преломления
· Коэффициент отражения
· Коэффициент затухания
· Цвет поверхности
· Нормаль к поверхности (устанавливается после нахождения очередного пересечения).
Класс | Комментарии |
CTexture | Реализует интерфейс обращения к любому типу текстуры в виде набора виртуальных функций, а также хранит указатель на объект класса файла текстуры |
CTextureFile | Обеспечивает загрузку из файла битовой карты текстуры или генерацию процедурной текстуры, ее интерпретацию, а также предоставляет методы обращения к этой карте. |
CParallelTexture | Класс текстуры, накладываемой на треугольник |
CPerlinNoise | Класс генерирующий процедурную фактуру с помощью шума Перлина |
Назначение классов, реализующих текстуру и фактуру
3.2.3 Базовые трехмерные объекты
Все классы трехмерных объектов, с которыми находится пересечение лучей, наследуются от абстрактного класса C3DObject, который реализует такие операции, присущие всем объектам, как пространственные преобразования, а также предоставляет унифицированный интерфейс обращения к объектам через виртуальные функции (таким способом реализованы методы поиска пересечений, текстурирования, фактурирования).
Диаграмма классов выглядит следующим образом:
Метод | Комментарии |
CRender(SeaScene *scene) | Конструктор класса, принимающий указатель на объект-сцену. Инициализирует объект визуализации. |
renderFrame(int xr, int yr, int d, CPaintDC *dc) | Метод построения изображения, являющийся «оболочкой» для всех остальных методов. Включает цикл по пикселам изображаемого изображения, вычисление луча для каждого пиксела, вызов процедур реализации алгоритма и закраски пиксела полученным цветом. |
trace(double refr, double att, CRay& ray, int level=0) | Метод, реализующий алгоритм обратной трассировки лучей. Здесь осуществляется поиск пересечений луча с объектами сцены и вызывается процедура определения цвета. |
shade(double refr, double att, CRay& ray, C3DObject* obj, int level) | Метод определения цвета точки поверхности. Содержит реализацию формулы Уиттеда и вызов процедуры теневого луча каждого источника света. |
3.2.7 Классы интерфейса
Интерфейс данной программы строился путем создания классов диалоговых окон, меню и элементов управления, унаследованных от стандартных классов библиотеки MFC. Общая диаграмма классов интерфейса изображена на рис. 3.6.
Программа имеет русскоязычный интерфейс, организованный в виде главного меню и ряда диалоговых окон, позволяющих пользователю после старта программы устанавливать параметры как самих объектов сцены (лодка ,солнце водная поверхность), так положение и направление луча наблюдения камеры и размер получаемого изображения.
Доступ ко всем функциям и настройкам программы осуществляется через главное меню.
Структура главного меню: