Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursach.doc
Скачиваний:
21
Добавлен:
03.03.2016
Размер:
5.93 Mб
Скачать

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

  1. Функции аффинного преобразования в пространстве:

- 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.

  1. Функции проецирования:

- glViewPort(x,y,width,height) – устанавливает область вывода, заданную переменными x, y, width и height;

- glOrtho(Xmi,Xma,Ymi,Yma,Zmi,Zma) – ортографическая проекция. Xmi, Xma, Ymi и Yma, Zmi, Zma – координаты противолежащих углов параллелепипеда;

  1. Функции для работы с камерой:

- glLookAt(ex,ey,ez,lx,ly,lz,x,y,z) – задает позицию и направление камеры. ex, ey, ez – координаты наблюдателя, lx, ly, lz – точка наблюдения, x, y, z – координаты вектора главной оптической оси камеры.

  1. Функции для работы со светом:

- glLight(light,pname,param) – задает параметры источнику света;

- glLightModelf(pname,param) – задает модель освещения. Pname - имя параметра модели освещения, param – устанавливаемое значение.

  1. Функции удаления невидимых граней:

- glEnable(DEPTH_TEST) – включает тест глубины;

- glDisable(DEPTH_TEST) – выключает тест глубины;

- glDepthFunc(func) – устанавливает функцию глубины;

- glClearDepth(dep) – очищает буфер глубины;

- glDepthRange(Zn,Zf) – задает диапазон глубины.

  1. Функции работы с матрицами:

- glLoadMatrixf(float *matr) – устанавливает в качестве текущей матрицы matr;

- glMultMatrixf(float *matr) – умножает текущую матрицу на matr;

- glLoadIdentity() – делает текущую матрицу единичной;

- glMatrixMode(int matr) – задаёт текущую матрицу.

  1. Функции получения переменных состояния:

- glGetFloatf(float *v) – получение значения переменной типа float;

  1. Функции заания значений переменных состояния булевого типа:

- glEnable(int param) – установка переменной, заданной параметром pname, в true;

- glDisable(int param) – установка переменной, заданной параметром pname, в false.

6.9 Реализация аффинных преобразований

В программе графического моделирования пользователю предоставляется возможность выполнения пяти видов аффинных преобразований: перенос, вращение, масштабирование, сдвиг и отражение. Причём, задание параметров каждого из преобразований производится пользователем. Все аффинные преобразования производятся над всеми примитивами одновременно.

Преобразования переноса, поворота и масштабирования производятся путём вызова функций OpenGL, соответствующих этим преобразованиям (glTranslate, glRotate и glScale), а преобразования отражения и сдвига – путём умножения матрицы модельно-видового преобразования на матрицу соответствующего аффинного преобразования, путём вызова функции OpenGL glMultMatrix.

6.10 Описание структуры программы в виде блок-схемы

Структура работы программы отражена диаграммой состояний на рисунке 6.3.

Рисунок 6.3 - Дианрамма состояний

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]