Главная страница

Курсовой проект 106 страниц, 42 рисунка, 2 таблицы, 18 фомул, 15 матриц, 4 приложения


Скачать 5.65 Mb.
НазваниеКурсовой проект 106 страниц, 42 рисунка, 2 таблицы, 18 фомул, 15 матриц, 4 приложения
АнкорKursach.doc
Дата17.08.2018
Размер5.65 Mb.
Формат файлаdoc
Имя файлаKursach.doc
ТипКурсовой проект
#23097
страница3 из 10
1   2   3   4   5   6   7   8   9   10

4.6 Модель эллипсоида



Эллипсоид в графической базе данных задается следующими параметрами:

  • r – радиус эллипсоида;

  • h – половина высоты эллипсоида;

  • n – количество разбиений на вертикальной полуокружности,

  • m – количество разбиений на горизонтальной полуокружности.

Рассмотрим построение геометрической модели эллипсоида с помощью меридиан и параллелей, центр локальной системы координат свяжем с геометрическим центром эллипсоида, оси которой направлены произвольно. Построение геометрической модели представлено на рисунке 4.6.


z

y

x

0

β

α

Рисунок 4.6 – Модель эллипсоида
Построение эллипсоида начинаем с построения точки с координатами Р00(0, 0, r). Затем строится нулевой меридиан (кривая разбивается на n точек) по формуле:

(4.9)
,

где - коэффициент растяжения;

- угол поворота.

Построенная ломаная, точки P0,0…Pn,0 - нулевой меридиан.

Построение параллелей производится путем вращения нулевого меридиана вокруг оси Z на угол α = 2π/m.

Следовательно, в графической базе данных модель эллипсоида можно задать с помощью формулы (4.10):

Эллипсоид(r,h,n,m) (4.10)

где r – радиус эллипсоида, h – высота половыны эллипсоида, n - количество меридиан, m - количество параллелей.
4.7 Геометрическая модель косоугольного конуса
Косоугольный конус задаётся четырьмя параметрами: высота, радиус основания, смещение вершины конуса относительно центра основания вдоль оси OX, количество разбиений основания. Обозначим эти параметры соответственно буквами h, r, s и n.

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

Ai+1= Ai*ПоворотOZ(360/n), (4.11)
а координаты вершины конуса будут равны (s, 0, h).

Вид геометрической модели косоугольного конуса приведен на рисунке 4.6.


Рисунок 4.6 – Вид геометрической модели косоугольного конуса
4.8 Геометрическая модель пирамиды с пятиугольным основанием
Пирамида с пятиугольным основанием задаётся двумя параметрами: высота и радиус окружности, в которую вписано основание. Обозначим эти параметры соответственно буквами h и r.

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

Ai+1= Ai*ПоворотOZ(360/5), (4.12)
а координаты вершины конуса будут равны (0, 0, h).

Вид геометрической модели пирамиды с пятиугольным основанием приведен на рисунке 4.7.


Рисунок 4.7 – Вид геометрической модели пирамиды с пятиугольным основанием
4.9 Геометрическая модель усечённой пирамиды с трёугольным основанием
Данный объект задаётся тремя параметрами: высота, радиус окружности, в которую вписано нижнее основание и радиус окружности, в которую вписано верхнее основание. Обозначим эти параметры соответственно буквами h, r1 и r2.

Пусть центр нижнего основания совпадает с началом локальной системы координат, а часть пирамиды без этого основания находится со стороны положительного направления оси OZ. Первая точка нижнего основания имеет координаты A11=(0, r1, 0), а первая точка верхнего основания A21=(0, r2, h). Тогда координаты остальных точек нижнего снования будем находить по следующей формуле:

A1i+1= A1i*ПоворотOZ(360/3), (4.13)
а координаты точек верхнего основания – по формуле:

A2i+1= A2i*ПоворотOZ(360/3). (4.14)
Вид геометрической модели усеченной пирамиды с треугольным основанием приведен на рисунке 4.8.


Рисунок 4.8 – Геометрическая модель усечённой пирамиды с трёугольным основанием
4.10 Моделирование икосаэдра

Для построения икосаэдра (рис. 4.9) используется цилиндр радиуса R , ось Z которого совпадает с осью цилиндра, а основание находится друг от друга на расстоянии ± h/2.



Рисунок 4.9 Построение икосаэдра

Каждое из окружностей оснований разбивается на 5 равных сегментов, и точки окружности последовательно соединяются между собой. Вращаясь против часовой стрелки на угол φ = 2*π /5, выбираются точки на первой и на второй окружности соответственно.

На высоте: выбираются вершины P'0 и P''0 и соединяются с вершинами в основании (верхнего и нижнего соответственно).

Остальные вершины получаются с помощью матрицы поворота:

P’i= P’i-1*Поворот(2*π/5) (4.1)

P"i= P”i-1*Поворот(2* π /5) (4.2)
Модель построенного икосаэдра изображена на рисунке 4.10.


Рисунок 4.10 – Модель икосаэдра

4.11 Геометрическая модель додекаэдра
Построение додекаэдра осуществляется при помощи икосаэдра.

Ниже приведены краткие шаги данной операции.

  1. Построение икосаэдра;

  2. Определение геометрических центров каждой из граней;

  3. Соединение геометрических центров.

Для построения икосаэдра используется цилиндр единичного радиуса R, ось которого совпадает с осью OZ, и основание находится соответственно на высоте . Каждая из окружностей разбивается на 5 равных сегментов, и точки на окружности последовательно соединяются между собой.

Двигаясь против часовой стрелки с шагом α=2π/n, выбираются точки то на одной, то на другой окружности. Далее происходит попарно соединение точек. На высоте берется окончательная вершина.

В графической базе данных додекаэдр можно представить в виде:

Додекаэдр(W), (4.15)

где w – длина стороны.

На рисунке 4.11 изображена геометрическая модель додекаэдра.


Рисунок 4.11 – Геометрическая модель додекаэдра

5 ПОШАГОВОЕ ПОСТРОЕНИЕ МОДЕЛИ СЛОЖНОГО ОБЪЕКТА

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

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

- призма с треугольным основанием Prizm3(r1, h1);

- икосаэдр Iko(r2);

- усеченная пирамида с треугольным основанием Piramid3(r3, r4, h2,).

Лапа с клещами состоит из следующих примитивов:

- косоугольный цилиндр Cyl(r5, h3, n1,m1)*M(сдвига);

- косоугольная призма с теугольным основанием KosPr(r6, h4)* *M(сдвига).

Глаз состоит из следующих примитивов:

- сфера Sphere (r7, n2, m2).

Тело состоит из следующих примитивов:

- полусфера Halfsphere(r8, n3, m3)*M(отсечения);

- элипсоид Elips(r9, n4, m4)*M(сжатия),

где r(i) – радиус, h(i) – высота, n(i), m(i) - число разбиения, М – матрица.

n1=n2=n3=n

m1=m2=m3=m

Запишем значения параметром фигур через r7:

h1=20*r7;

h2=r7;

h3=18*r7

h4=4*r7

r1=1.5*r7;

r2=r7;

r3=r7;

r4=2*r7;

r5=1.5*r7;

r6=1.5*r7;

r8=9*r7

r9=12*r7;

5.3 Пошаговое построение сложного объекта
Строим тело:

- Стоим элипосид:

Строим сферу радиусом 12*r7, умножаем на матрицу сжатия М(0.8, 1, 0.25), получаем элипсоид (рисунок 5.1).

Z

Y

X


Рисунок 5.1 – Эллипсоид
Строим полусферу:

- cтроим сферу радиусом 9*r7. Отсекаем пол сферу по оси –OZ.

Полученная фигура будет телом (рисунок 5.2).

Z

-X

Y


Рисунок 5.2- Тело
Строим глаза:

1 глаз:

- cтроим сферу радиусом r7. Переносим на (4*r7, 3*r7, 8*r7);
2 глаз:

- строим сферу радиусом r7. Переносим на (-4*r7, 3*r7, 8*r7).

Полученная фигура будет телом с глазами (рисунок 5.3)

Z

-X

Y


Рисунок 5.2- Тело с глазами
Строим лапы:

- строим призму с треугольным основанием:

- строим цилиндр с числом разбиения равным 3, радиуса 1.5*r7 и высотой 20*r7;

- строим икосаэдр

строим икосаэдр радиусом r7 и перемещаем на (0, 0, 20*r7);

- строим усеченную призму с треугольным основанием:

строим цилиндр с числом разбиения равным 3, радиусами r7, 2*r7 и высотой r7, поворачиваем вокруг оси OY на -90 градусов, перемещаем на (0, 0, 3*h-2/5h).

1 лапа:

- поворачиваем построенные фигуры на 90 градусов вокруг оси OX и 45 градусов вокруг оси OZ;

2 лапа:

- поворачиваем построенные фигуры на 90 градусов вокруг оси OX и -45 градусов вокруг оси OZ;

3 лапа:

- поворачиваем построенные фигуры на -90 градусов вокруг оси OX и 45 градусов вокруг оси OZ;

4 лапа:

- поворачиваем построенные фигуры на -90 градусов вокруг оси OX и -45 градусов вокруг оси OZ;

Полученная фигура будет содержать лапы (рисунок 5.3)


Z

-X

Y


Рисунок 5.3 - Фигура с лапами
Строим лапы с клещнями:

- строим косоугольный цилиндр:

- строим цилиндр радиусом 1.5*r7, высотой 20*r7, сдвигаем по оси OY на 0.1*r7

- строим косоугольную призму с треугольным основанием:

- строим цилиндр с числом разбиения равным 3, радиусом 1.5*r7, высотой 18*r7, сдвигаем по оси OX на 0.1*r7, перемещаем на 4*r7;

- Поворачиваем полученные фигуры на 90 градусов вокруг оси OX.

1 лапа с клещней:

- поворачиваем полученные фигуры на 30 градусов вокруг оси OY;

2 лапа с клещней:

- поворачиваем полученные фигуры на -30 градусов вокруг оси OY.

Получили робота-краба (рисунок 5.4)





Z

-X

Y


Рисунок 5.4 - Робот-краб

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 - Дианрамма состояний

7 ПРОВЕДЕНИЕ ТЕСТОВЫХ ИСПЫТАНИЙ

Проведение тестовых испытаний заключалось в следующем:

- тестирование работы алгоритмов аффинных преобразований над заданной моделью робота-краба и базовых примитивов (см. рис. ,В14,В12);

- тестирование камеры и источников света (см. рис. В.10,В.11,В.13);

- тестирование прорисовки заданных примитивов (см. рис. В.2-В.9);

- тестирование открытия и сохранения сцены;

- сравнение фигуры построенной фигуры (В.14) с ее моделью (А1).

ЗАКЛЮЧЕНИЕ
В результате работы над курсовым проектом была создана интерактивная система трехмерного графического моделирования в пространстве таких объектов как: сфера, полусфера, икосаэдр, призма с треугольным основанием, усеченная пирамида с треугольным основанием, косоугольная призма с треугольным основанием, эллипсоид, косоугольный цилиндр. В ходе реализации проекта были рассмотрены аффинные преобразования как методы выполнения преобразований над объектами в пространстве. Реализована возможность сохранение сцены в файл. Результаты тестирования показали, что программа удовлетворяет предъявленным в постановке задания требованиям.

В дальнейшем КП может быть модернизирован и улучшен в соответствии с нововведенными требованиями.

Список использованной литературы


  1. Курс лекций.

  2. Френсис Хилл. OpenGL. Программирование компьютерной графики. Для профессионалов. – Спб.: Питер, 2002. – 1088 с.: ил.

  3. Девис Т., Нейдер Дж., Шрайнер Д. OpenGL. Руководство по программированию. Юиюлиотека программиста. 4-е издание.- СПб: Питер, 2006 -624с.

  4. Выгодский М.Я. Справочник по высшей математике.– М.: Наука, 1964. – 872с.: ил.

  5. Баяковский Ю.М., Игнатенко А.В. Начальный курс OpenGL.М.: «Планета Знаний», 2007. – 221с.

  6. Шикин А.В. Боресков А.В. Компьютерная графика. Динамика, реалистические изображения. – М.: ДИАЛОГ-МИФИ, 1996. – 288с.

  7. Препарата Ф., Шеймос М. Вычислительная геометрия: Введение: Пер. с англ. - М.: Мир, 1989.-478с.

  8. Эгрон Жерар. Синтез изображений. Базовые алгоритмы.: пер. с франц. А.В.Серединского. М.:Радио и связь, 1993. 216с. библ.-44 , рус.библ.-5.

  9. Rogers, D. 1998. Procedural Element for Computer Graphics. New York: McGraw-Hill;

  10. Yaglom, I.M. 1962 Geometric Transformations. Toronto. Random House.

  11. FAQ по программированию OpenGL http://faqs.org.ru [opengl.txt]


Приложение А
1   2   3   4   5   6   7   8   9   10


написать администратору сайта