
6 Описание программной реализации
6.1 Структуры данных для хранения параметрических объектов
В данном курсовом проекте описаны классы, упрощающие работу с 3D-примитивами, информационной частью данных классов являются структуры данных, хранящие параметры объектов. Иерархия данных классов описывается диаграммой на рисунке 6.1.
Рисунок 6.1 – Иерархия классов, содержащих параметры объектов сцены
6.2 Структуры данных для камеры
В реализуемом программном продукте структура данных для камеры описывается на языке C++ следующим образом:
struct
{
float posx, posy, posz;
float dirx, diry, dirz;
}settings, где
posx, posy, и posz –соответственно координаты наблюдателя, а dirx, diry, dirz – соответственно координаты направляющего вектора.
6.3 Структуры данных для источников света
В реализуемом программном продукте структура данных для источников света описывается на языке C++ следующим образом:
struct
{
float pos[4];
float dir[3];
float color[4];
int lightmodeltype;
bool shining;
} settings, где
pos – массив координат источника света, dir – массив координат напрвляющего вектора, color – массив, содержащий цвет излучаемого света в формате RGBA, lightmodeltype – тип источника света (точечный, удалённый, цилиндрический), shining – признак включенности источника света.
Выше приведена структура данных заключена в класс, написанный для облегчения работы с источниками света, имеющий следующий протокол
class LIGHT
{
struct{
float pos[4];
float dir[3];
float color[4];
int lightmodeltype;
GLboolean shining;
} settings;
int index;
public:
void Draw();
GLenum GetIndex();
bool Shining();
LIGHT& TurnOn();
LIGHT& TurnOff();
LIGHT(int gllight):index(gllight);
~LIGHT(){glDisable(index);}
void SetLightModelType(int lmt);
void Dispose(float PosX, float PosY, float PosZ, float PosT);
LIGHT& Direct(float DirX, float DirY, float DirZ);
LIGHT& SetColor(float r, float g, float b);
void GetPosition(float *x, float *y, float *z);
void GetDirection(float *x, float *y, float *z);
void GetColor(float *r, float *g, float *b);
};
6.4 Описание внутреннего формата графической БД
Графическая база данных реализуемого программного продукта организована в виде набора структур данных, содержащих параметры графических примитивов, камеры и источников. К операциям, осуществимым над графической базой данных, относятся добавление, удаление и поиск графических примитивов, а также изменение их параметров.
6.5 Описание формата файла хранения сцены
Файл, содержащий параметры сцены имеет формат, показанный на таблице 6.1.
Таблица 6.1 – Описание формата файла хранения сцены
Название блока |
Размер блока в байтах |
Параметры графических примитивов |
508 |
Параметры источников света |
236 |
Параметры камеры |
85 |
Матрица модельно-видовых преобразований |
64 |
Параметры интерфейса программы |
18 |
Размер файла хранения сцены составляет 911 байт.
6.6 Описание программных моделей
Для удобства построения системы трехмерного графического моделирования программа была разбита на следующие модули:
- KP.cpp – главный программный модель;
- globals.h – файл, содержащий описание глобальных переменных, доступных из всех программных модулей;
- glsetup.h – файл, содержащий подпрограммы, служащие для установки матриц проекций и областей просмотров;
- primitives.h – файл, содержащий описание протоколов и реализации классов, упрощающих работу с графическими примитивами;
- light.h – файл, содержащий описание протоколов и реализации классов, упрощающих работу с источниками света;
- camera.h – файл, содержащий описание протокола и реализацию классоа, упрощающего работу с камерой;
- drawscene.h - файл, содержищий подпрограммы отрисовки сцены;
- mainwnd.h - файл, содержищий описание функций для работы с главным окном программы;
- panel.h – файл, содержищий описание функций для работы с панелью управления в главном окне программы;
- panel_aff_aj.h, panel_camera.h, panel_light.h, panel_primitives.h, panel_scene.h – модули, касающиеся построения интерфейса программы, содержащие реализацию подпрограмм, описывающих поведение диалоговых панелей, позволяющих пользователю изменять параметры камеры, графических примитивов, источников света и сцены, а также осуществлять аффинные преобразования.
Взаимосвязь программных модулей показана на рисунке 6.2.
Рисунок 6.2 - Взаимосвязь программных модулей
6.7 Описание основных процедур и функций
Программный продукт, реализуемый в данном курсовом проекте, разбит на функции следующих категорий:
1) функции настройки графического вывода:
- void glSetViewport(int vp). Устанавливает область вывода. vp – параметр, задающий область вывода, которую необходимо установить;
- void SetOrtho(). Устанавливает ортографическую проекцию;
- void SetIso(). Устанавливает изометрическую проекцию.
2) Функции отрисовки графических примитивов и визуализации источников света:
- void SPHERE::Draw(). Функция отрисовки сферы;
- void HALFSPHERE::Draw(). Функция отрисовки полусферы;
- void CUBE::Draw(). Функция отрисовки куба;
- void PRISM5::Draw(). Функция отрисовки пятигранной пизмы;
- void PRISM3::Draw(). Функция отрисовки трёхгранной призмы;
- void PIRAMID::Draw(). Функция отрисовки пирамиды с пятиугольным основанием;
- void PIRAMID3::Draw(). Функция отрисовки усечённой пирамиды с трёхугольным основанием;
- void CONE::Draw(). Функция отрисовки косоугольного конуса;
- void LIGHT::Draw(). Функция визуализации источника света.
- void DrawAxes().Функция отрисовки координатных осей;
- void DrawScene(). Функция отрисовки всей сцены.
3) функции сохранения-зугрузки параметров сцены:
- void SaveScene(char *fn). Сохраняет в файл с именем, заданным аргументом fn, параметры сцены;
- void LoadScene(char *fn). Загружает параметры сцены из файла с именем, заданным аргументом fn;
4) функции построения графического интерфейса:
- void ShowHelp(). Данная функция загружает текст справки из файла и выводит в его во всплывающем окне;
- void InitMainWindow(HINSTANCE hInstance, char *caption, int wdth). Инициализирует главное окно программы. hInstance – экземпляр приложения, caption – заголовок главного окна, width – ширина главного окна;
- void InitPanel(HINSTANCE hInstance). Инициализирует окно панели управления. hInstance – экземпляр приложения;
- void ShowSeparators(int cmd). Функция показа-скрытия разделителей окон проекций. cmd – аргумент, значением которого определяется выполняемое действие (показ или скрытие).
6.8 Описание использованных функций OpenGL
Функции аффинного преобразования в пространстве:
- glRotatef(float a, float x, float y, float z) – поворот. a – угол поворота, x, y, z – координаты вектора, вокруг которого осуществляется вращение;
- glScalef(float x, float y, float z) – масштабирование. x, y и z –коэффициенты масштабирования соответственно по осям Ox, Oy и Oz;
- glTranslatef(float x, float y, float z) – перенос. x, y, z – коеффициенты, задающие расстояние, на которое происходит перемещение по осям Ox, Oy и Oz.
Функции проецирования:
- glViewPort(x,y,width,height) – устанавливает область вывода, заданную переменными x, y, width и height;
- glOrtho(Xmi,Xma,Ymi,Yma,Zmi,Zma) – ортографическая проекция. Xmi, Xma, Ymi и Yma, Zmi, Zma – координаты противолежащих углов параллелепипеда;
Функции для работы с камерой:
- glLookAt(ex,ey,ez,lx,ly,lz,x,y,z) – задает позицию и направление камеры. ex, ey, ez – координаты наблюдателя, lx, ly, lz – точка наблюдения, x, y, z – координаты вектора главной оптической оси камеры.
Функции для работы со светом:
- glLight(light,pname,param) – задает параметры источнику света;
- glLightModelf(pname,param) – задает модель освещения. Pname - имя параметра модели освещения, param – устанавливаемое значение.
Функции удаления невидимых граней:
- glEnable(DEPTH_TEST) – включает тест глубины;
- glDisable(DEPTH_TEST) – выключает тест глубины;
- glDepthFunc(func) – устанавливает функцию глубины;
- glClearDepth(dep) – очищает буфер глубины;
- glDepthRange(Zn,Zf) – задает диапазон глубины.
Функции работы с матрицами:
- glLoadMatrixf(float *matr) – устанавливает в качестве текущей матрицы matr;
- glMultMatrixf(float *matr) – умножает текущую матрицу на matr;
- glLoadIdentity() – делает текущую матрицу единичной;
- glMatrixMode(int matr) – задаёт текущую матрицу.
Функции получения переменных состояния:
- glGetFloatf(float *v) – получение значения переменной типа float;
Функции заания значений переменных состояния булевого типа:
- glEnable(int param) – установка переменной, заданной параметром pname, в true;
- glDisable(int param) – установка переменной, заданной параметром pname, в false.
6.9 Реализация аффинных преобразований
В программе графического моделирования пользователю предоставляется возможность выполнения пяти видов аффинных преобразований: перенос, вращение, масштабирование, сдвиг и отражение. Причём, задание параметров каждого из преобразований производится пользователем. Все аффинные преобразования производятся над всеми примитивами одновременно.
Преобразования переноса, поворота и масштабирования производятся путём вызова функций OpenGL, соответствующих этим преобразованиям (glTranslate, glRotate и glScale), а преобразования отражения и сдвига – путём умножения матрицы модельно-видового преобразования на матрицу соответствующего аффинного преобразования, путём вызова функции OpenGL glMultMatrix.
6.10 Описание структуры программы в виде блок-схемы
Структура работы программы отражена диаграммой состояний на рисунке 6.3.
Рисунок 6.3 - Дианрамма состояний