Смекни!
smekni.com

Построение реалистических изображений поверхности океана с 3-х мерной лодки которая плавает (стр. 5 из 6)

В качестве среды разработки была выбрана MicrosoftVisualStudio 6.0:

· Для этой среды есть специальный компилятор фирмы Intel, который поддерживает очень мощную оптимизацию программы для процессоров вплоть до Pentium 4, что позволило резко повысить быстродействие программы.

· При разработке программы использовались библиотеки классов MFC (MicrosoftFoundationClasses), поставляемые вместе со средой разработки, которые позволяют существенно упростить разработку интерфейса программы по сравнению с использованием стандартных функций WindowsAPI.

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

3.2 Структура классов программы

В силу того, что при написании программы использовалась технология объектно-ориентированного программирования, особое внимание при рассмотрении ее структуры должно быть уделено структуре ее классов.

Условно все классы, присутствующие в программе, можно разделить на несколько частей по выполняемым функциям:

· Математические абстракции

· Вспомогательные классы свойств трехмерных объектов

· Базовые трехмерные объекты

· Источник света

· Сцена

· Алгоритмы визуализации

· Интерфейс пользователя

3.2.1 Математические абстракции

Математические абстракции в программе представлены тремя классами:

1. CVector – трехмерный вектор и операции над ним. Реализованы операции умножения на вектор, умножения на матрицу, умножения и деления на число, нахождение скалярного и векторного произведения, нормализации, определение длины. Некоторые операции продублированы операторами для удобства записи, а также введены операторы действий, совмещенных с присваиванием.

2. CMatrix – двумерная матрица 4х4, используемая в программе для задания трехмерных преобразований. Среди реализованных операций: умножение и деление на число, умножение на вектор и на другую матрицу, нахождение обратной и транспонированной матрицы. В класс матрицы включены статические методы, возвращающие матрицы преобразований: поворота, сдвига и масштабирования.

3. CRay – трехмерный луч, задающийся двумя трехмерными векторами: точкой испускания и направлением. Помимо стандартных методов-аксессоров обладает методом сдвига на заданную величину в направлении своего хода, что активно применяется в ходе выполнения алгоритма обратной трассировки лучей.

3.2.2 Вспомогательные классы свойств трехмерных объектов

Одним из основных классов, задающих внешний вид трехмерного объекта, является класс CSurface, среди атрибутов которого присутствуют следующие величины:

· Коэффициент фоновой освещенности

· Коэффициент диффузного отражения

· Коэффициент зеркального отражения

· Коэффициент Фонга (характеризует пространственное распределение зеркально отраженного света)

· Коэффициент прозрачности

· Коэффициент преломления

· Коэффициент отражения

· Коэффициент затухания

· Цвет поверхности

· Нормаль к поверхности (устанавливается после нахождения очередного пересечения).

Еще одной немаловажной визуальной характеристикой объекта является его текстура и фактура. И то, и другое реализуется с использованием одни и тех же классов, составляющих следующую иерархию:

Назначение каждого из этих классов дается в таблице 3.1:

Таблица 3.1

Класс Комментарии
CTexture Реализует интерфейс обращения к любому типу текстуры в виде набора виртуальных функций, а также хранит указатель на объект класса файла текстуры
CTextureFile Обеспечивает загрузку из файла битовой карты текстуры или генерацию процедурной текстуры, ее интерпретацию, а также предоставляет методы обращения к этой карте.
CParallelTexture Класс текстуры, накладываемой на треугольник
CPerlinNoise Класс генерирующий процедурную фактуру с помощью шума Перлина

Назначение классов, реализующих текстуру и фактуру

3.2.3 Базовые трехмерные объекты

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

Диаграмма классов выглядит следующим образом:


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

Необходимо заметить, что класс объекта содержит в себе не экземпляры текстуры и материала, а всего лишь указатели на них, что позволяет сэкономить память и вычислительные ресурсы, а также повторно использовать объекты вспомогательных классов в других трехмерных объектах.

3.2.4 Источник света

Источники света являются одними из основных понятий, участвующих в построении трехмерного изображения. В программе реализован только один источника – солнце, однако для возможности добавления новых источников света(Луны, фонарей) и большей гибкости программы был выделен класс-предок CLight, от которого наследуется класс солнечного источника света CSun.

На рис. 3.3 изображена соответствующая диаграмма классов.

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

Метод shadingCoef, реализующий этот механизм, объявлен как виртуальный в классе CLight и реализуется уже в классе CSun.

3.2.5 Сцена

Класс сцены SeaScene полностью характеризует набор объектов и их свойств, подлежащих визуализации. Он включает:


Объекты лодка, солнце и водная поверхность (экземпляры классов CBoat, CSun, CWater)

· Методы установки параметров камеры

· Методы параметров самих объектов

· Информация о размере строящегося изображения и субпиксельном разбиении

· Методы получения трассирующих лучей

Соответствующая диаграмма классов представлена на рис. 3.4.

3.2.6 Алгоритмы визуализации

Базовые алгоритмы визуализации представлены в классе CRender. Этот класс хранит указатель на объект класса SeaScene и все действия совершает над ним. Основные методы класса перечислены в таблице 3.2.


Таблица 3.2. Методы класса визуализации

Метод Комментарии
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.

3.3. Пользовательский интерфейс

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

Доступ ко всем функциям и настройкам программы осуществляется через главное меню.


3.3.1 Главное меню

Структура главного меню: