2.1.2.2 Конвертация файла
Назначение задачи “Конвертация файла” состоит в преобразовании указанного файла с описанием модели (3DS или Obj) в универсальный формат файла 3DO. При конвертации исходный файл будет дополнен по возможности дополнительной информацией облегчающей использование 3DO файла в приложении. Это может быть расчет нормалей к граням для 3DS файла или расчет нормалей во всех вершинах для 3DS и Obj. Такие дополнительные расчеты призваны сократить время обработки 3DO файла при его загрузке, т.к. отпадет необходимость в повторном их выполнении.
Входными данными задачи являются:
) путь к конвертируемому файлу (3DS или Obj);
) путь и имя получаемого файла (3DO).
Структура исходного 3DO файла была описана выше.
К выходным данным относится полученный универсальный 3DO файл.
.1.2.3 Генерация шаблона
Назначение задачи “Генерация шаблона” состоит в получении каркаса приложения используемого в дальнейшем для разработки несложных графических программ.
При выборе шаблона с подключенной библиотекой будет сгенерировано приложение позволяющее загрузить и вывести на экран сконвертированный универсальный 3DO файл.
Входными данными задачи являются:
) путь и имя генерируемого шаблона;
) путь к универсальному 3DO файлу.
К выходным данным относится полученный каркас графического приложения.
2.1.3 Анализ третьего уровня детализации задачи
Рассмотрим структуру задачи “Конвертация файла” (рисунок 2.3).
2.1.3.1 Загрузка файла для конвертации
Целью задачи является загрузка данных, описывающих геометрию объекта, из внешнего файла (3DS или Obj) во внутренние структуры приложения.
Входными данными задачи являются путь и имя универсального 3DO файла.
К выходным данным относятся загруженные в память приложения данные о
геометрии модели из конвертируемого файла.
Рисунок 2.3 - структура задачи “Конвертация файла”
2.1.3.2 Расчет недостающих данных
Обычно в 3D форматах для минимизации их объема стараются хранить не всю информацию о геометрии модели. В таких случаях могут опускаться такие данные, например, как нормали (в вершинах и у граней). При этом расчет этих данных возлагается на приложение, а это негативно влияет на его производительность.
По этой причине для увеличения производительности приложения, использующего данные из 3DO файла, геометрия исходного файла дополняется рассчитанными недостающими данными. В случае, когда исходным файлом является 3DS файл, производится расчет нормалей и у вершин и к граням, а когда Obj файл - только вершинных.
К входным данным относятся структуры в памяти, полученные при загрузке исходного файла, и описывающие геометрию модели (массивы вершин, граней и т.п.).
Выходными данными являются рассчитанные нормали (вершинные и/или к
граням).
2.1.3.3 Сохранение данных в 3DO формате
Основной целью задачи является сохранение, полученных после дополнительных расчетов, описания геометрии объектов в разработанный универсальный 3DO формат.
Входными данными является полное описание геометрии объектов, хранимое во внутренних структурах приложения, а также путь и имя 3DO файла.
Выходными данными является файл в 3DO формате, описывающий геометрию объектов.
Рассмотрим структуру задачи “Генерация шаблона” (рисунок 2.4).
Рисунок 2.4 - структура задачи “Генерация шаблона ”
2.1.3.4 Настройка параметров шаблона
К задаче “Настройка параметров шаблона” относится:
) указание пути и имени 3DO файла;
) указание пути по которому шаблон будет сохранен.
2.1.3.5 Создание и сохранение шаблона
Под созданием шаблона понимается внесение настроек в уже готовый каркас приложения (простой или с подключенной библиотекой). После чего измененный каркас переносится по указанному в настройках пути. При этом в папку с шаблоном также копируется и 3DO файл.
Готовый шаблон представляет собой проект выполненный в Microsoft Visual Studio 2005 на базе MFC Application.
Входными данными являются настройки шаблона.
К выходным данным относится полученный после конфигурирования шаблон.
2.2 Анализ шаблона графического приложения
.2.1 Анализ первого уровня детализации задачи
На первом уровне детализации приложение можно представить в виде трех
основных блоков, представленных на рисунке 2.5.
Рисунок 2.5 - первый уровень детализации
Основными входными данными являются графические файлы, с описанием моделей в форматах поддерживаемых приложением - 3DS, Obj и 3DO форматы. В последующих версиях планируется увеличение поддерживаемых форматов.
К выходным данным относится отображенный на экране выбранный 3D файл.
2.1.2 Анализ второго уровня детализации задачи
Структура рассматриваемой задачи на втором уровне детализации представлена на рисунке 2.6.
Рисунок 2.6 - второй уровень детализации
2.2.2.1 Инициализация OpenGL
Назначение задачи “Инициализация OpenGL” состоит в начальной инициализации внутренних данных библиотеки OpenGL. Инициализация представляет собой следующие шаги:
) установка формата пикселей;
) создание контекста отображения;
) выбор текущего контекста отображения.
2.1.2.2 Загрузка 3D файла
Целью задачи является загрузка данных, описывающих геометрию объекта, из внешнего файла (3DS, Obj или 3DO) во внутренние структуры приложения.
Входными данными задачи являются путь и имя 3D файла.
К выходным данным относятся загруженные в память приложения данные о геометрии модели из выбранного файла.
2.1.2.3 Вывод 3D файла на экран
Назначение задачи “Вывод 3D файла на экран” состоит в отображении на экране средствами библиотеки OpenGL геометрии объектов загруженных ранее из 3D файла.
При выводе пользователь имеет возможность задать некоторые настройки,
влияющие на отображение объектов на экране.
3. Разработка алгоритмов решения задачи
Этот раздел содержит описание алгоритмов решения следующих задач:
) автоматизированная система генерации приложений, использующих библиотеку OpenGL:
a) ввод данных;
b) конвертация файла;) генерация шаблона.
) шаблон графического приложения:
a) инициализация OpenGL;
b) загрузка 3D файла;
c) вывод 3D файла на экран.
Последовательное выполнение указанных задач обеспечивает достижение целей
основной задачи. Алгоритмы решения выделенных подзадач описаны в следующих
подразделах текущего раздела.
3.1 Автоматизированная система генерации
приложений
.1.1 Алгоритм решения задачи “Ввод данных”
Целью задачи “Ввод данных” является получение исходных данных необходимых для получения 3DO файла или шаблона приложения. Для достижения данной цели нужно выполнить следующие действия:
) для конвертации файла:
a) осуществить указание пути к конвертируемому файлу (3DS или Obj);
b) осуществить указание пути и имени получаемого файла (3DO).
) для генерации шаблона:
a) задать имя шаблона;
b) указать путь к 3DO файлу;) указать путь по которому шаблон
будет сохранен.
3.1.2 Алгоритм решения задачи “Конвертация
файла”
.1.2.1 Алгоритм решения задачи “Загрузка файла для конвертации”
В результате выполнения данной задачи будет получена структура содержащая описание геометрии исходного файла (3DS или Obj).
Основными этапами этой задачи являются:
) открытие файла для чтения;
) определение типа файла - либо по расширению, либо по заголовку;
) чтение и интерпретация данных из файла:
a) чтение данных о координатах вершин;
b) чтение данных об индексах граней;) чтение данных о нормалях к граням (для Obj формата).
) сохранение прочитанных данных во внутренние структуры;
) закрытие файла.
3.1.2.2 Алгоритм решения задачи “Расчет недостающих данных”
Результатом выполнения задачи “Расчет недостающих данных” будет получение нормалей в каждой вершине и ко всем граням модели.
Обычно в 3D файлах хранение нормалей необязательно, т.к. имеется возможность их получения с помощью других данных геометрии - вершин и граней. Но для этого необходимо провести ресурсоемкие расчеты.
Для определения вектора нормали к плоскости достаточно иметь координаты трех точек принадлежащих этой плоскости. На рисунке 2.1 схематически показано получение такой нормали.
Рисунок 2.1 - Нормаль к плоскости
детализация файл данные графический
По определению векторное произведение двух векторов есть вектор перпендикулярный плоскости определенной их координатами. Исходя из этого свойства нужный нам вектор нормали n можно представить как векторное произведение векторов ab и bc:
= (bc, ab) (1.1)
где n - вектор нормали;, bc - векторы перпендикулярные n.
Используя правило треугольника и зная соответствующие вектора a, b и c получим вектора ab и bc:
= b - a (1.2)
bc = b - c (1.3)
Чтобы привести вектор нормали к единичной длине необходимо разделить вектор на его норму (длину):
n1 = n / |n| (1.4)
где n1 - вектор единичной длины;- вектор нормали;
|n| - длина вектора нормали.
В случае когда необходимо найти нормаль в вершине дело предстоит немного иначе. Для определения нормали в вершине требуется пройтись по всем граням содержащим эту вершину и просуммировать их нормали. После чего необходимо привести нормаль к единичному виду.
Как видно поиск нормалей в вершинах может занять некоторое время, поэтому
хранение их в 3DO файле
оправданно, и сильно сэкономит предварительную инициализацию.
3.1.2.3 Алгоритм решения задачи “Сохранение данных в 3DO формате”
Результатом данной задачи будет получение 3DO файла, описывающего большинство параметров геометрии объектов (вершины, грани, нормали).
Алгоритм решения можно разделить на такие этапы:
) открытие файла для записи;
) запись геометрии объектов в файл с учетом структуры 3DO формата:
a) запись координат вершин;
b) запись координат нормалей в вершинах;) запись координат нормалей к граням;) запись количества вершин в каждой грани;) запись индексов граней;
) закрытие файла.
3.1.3
Алгоритм решения задачи “Генерация шаблона”
.1.3.1 Алгоритм решения задачи “Настройка параметров шаблона”
Выполнение данной задачи сводится к заполнению полей отвечающих за настройку параметров шаблона:
) имя шаблона;
) путь к шаблону;
) путь и имя 3DO
файла.
3.1.3.2 Алгоритм решения задачи “Создание и сохранения шаблона”
В результате проведения данной задачи будет получен сконфигурированный шаблон графического приложения.
Алгоритм “Создания и сохранения шаблона” подразумевает следующие пункты:
) копирование файлов шаблона по указанному пути;
) копирование 3DO файла.
3.2
Шаблон графического приложения
.2.1 Алгоритм решения задачи “Инициализация OpenGL”
Целью задачи “Инициализация OpenGL” является начальная инициализация OpenGL машины. Для достижения данной цели нужно выполнить следующие действия:
) установка формата пикселей;
) создание контекста отображения;
) выбор текущего контекста отображения.
3.2.2 Алгоритм решения задачи “Загрузка 3D файла”
Целью задачи “Загрузка 3D файла” является загрузка геометрии объектов из выбранного 3D файла.
Основными этапами этой задачи являются:
) открытие файла для чтения;
) определение типа файла - либо по расширению, либо по заголовку;
) чтение и интерпретация данных из файла:
a) чтение данных о координатах вершин;
b) чтение данных об индексах граней;) чтение данных о нормалях к граням;) чтение данных о нормалях в вершинах.
) сохранение прочитанных данных во внутренние структуры;
) закрытие файла.
3.2.3 Алгоритм решения задачи “Вывод 3D файла на экран”
Целью задачи “Вывод 3D файла на экран” является отображении на экране средствами библиотеки OpenGL геометрии объектов загруженных ранее из 3D файла.
Основными этапами этой задачи являются:
) настройка состояния отображения OpenGL окна;
) вывод 3D
объектов с помощью функций OpenGL.
4.
Синтез программного обеспечения
.1
Архитектура программного обеспечения
Для создания программного обеспечения в данной аттестационной работе используется язык программирования C++ и инструментальная среда разработки Microsoft Visual Studio 2005. Все создаваемые с помощью Microsoft Visual Studio 2005 приложения являются проектами. Студия предоставляет возможность создавать каркасы проектов при помощи генераторов приложений - мастеров. Мастер генерирует шаблон проекта, на основании которого, впоследствии, создается приложение. Также мастер предоставляет структуру программы, основные меню, панели инструментов, значки и т.д. Это позволяет, создав каркас приложения, сразу перейти непосредственно к программированию его функциональности.
Каркас проекта создан при помощи стандартного генератора приложений Application Wizard на основе шаблона MFC Application. Шаблон приложения MFC Application - является основой для стандартных приложений Windows.
В состав созданного при помощи Application Wizard проекта с именем GenOGLApp входят следующие файлы:
1) GenOGLApp.h - заголовочный файл, содержащий описание класса отвечающего за начальную инициализацию и создание главного окна проекта;
2) GenOGLApp.cpp - содержит реализацию выше описанного класса;
3) MainFrm.h - содержит описание класса отвечающего за внешний вид главного окна проекта;
4) MainFrm.cpp - содержит реализацию выше описанного класса;
5) GenOGLAppDoc.h - описывает класс хранящий основные данные проекта;
6) GenOGLAppDoc.cpp - содержит реализацию выше описанного класса;
7) GenOGLAppView.h - содержит описание класса отвечающего за отображение в главном окне проекта данных из предыдущего класса;
8) GenOGLAppView.cpp - содержит реализацию выше описанного класса;
9) Camera.h - отвечает за описание класса предоставляющего реализацию камеры для просмотра OpenGL окна;
10) Camera.cpp - содержит реализацию выше описанного класса;
11) ConvertDlg.h - содержит описание класса окна диалога отвечающего за конвертацию 3D файла в 3DO формат;
12) ConvertDlg.cpp - содержит реализацию выше описанного класса;
13) GenerateDlg.h - содержит описание класса окна диалога отвечающего за создание шаблона OpenGL приложения;
14) GenerateDlg.cpp - содержит реализацию выше описанного класса;
15) StdAfx.h - используется для создания пре-компилированного файла заголовка.
Основными классами приложения являются: