Разработка графических приложений с использованием библиотеки OpenGL

Автор: Пользователь скрыл имя, 27 Февраля 2012 в 21:25, курсовая работа

Описание работы

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

Содержание

Введение
1 Работа с двухмерными примитивами
1.1 Теоретическая часть создания двухмерного изображения
1.2 Практическая часть создания двухмерного изображения
2 Работа с трехмерными примитивами
1.2 Теоретическая часть создания трехмерного примитива
2.2 Практическая часть создания трехмерного примитива
3 Построение криволинейных поверхностей и работа с клавиатурой
3.1 Теоретическая часть создания криволинейной поверхности
3.2 Практическая часть создания криволинейной поверхности 19
Заключение
Список использованной литературы

Работа содержит 1 файл

Kursovaya моя.doc

— 1.43 Мб (Скачать)
le="text-align:justify">Кроме рассмотренных ранее стандартных примитивов в библиотеках GLU и GLUT описаны более сложные фигуры, такие как сфера, цилиндр, диск (в GLU) и сфера, куб, конус, тор, тетраэдр, додекаэдр, икосаэдр, октаэдр и чайник (в GLUT). Автоматическое наложение текстуры предусмотрено только для фигур из библиотеки GLU.

Чтобы построить примитив из библиотеки GLU, надо сначала создать объект quadObj, а затем вызвать одну из команд gluSphere(), gluCylinder() или gluDisk(). Рассмотрим эти команды отдельно [1, 4].

Базовый примитив конус (GLU)

gluCylinder(GLUquadricObj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks);

Рассмотрим фрагмент кода, создающий базовый примитив конус GLU и визуальный результат его выполнения (рис. 7).

Рис. 7. Трехмерный конус

GLUquadricObj *quadObj;                            // создаем новый объект

quadObj = gluNewQuadric();              // для создания цилиндра

glClearColor(0, 0, 0, 1);

// Увеличиваем угол поворота конуса на определенноё значение

Angle += 0.05f; // для вращения

glClear(GL_COLOR_BUFFER_BIT); // Очистим буффер цвета             

glLoadIdentity();

gluLookAt(100.0f, 100.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

glRotatef(Angle, 0.0f, 1.0f, 0.0f); // вращение

glTranslated(-10,0,0); // смещение

gluQuadricDrawStyle(quadObj, GLU_LINE); // устанавливаем каркасный стиль

gluCylinder (quadObj, 0, 10, 15, 25, 25);// конус радиусом 10, высотой 15, 25    // на 25 полигонов

gluDeleteQuadric(quadObj);

glutSwapBuffers(); // Меняем местами задний и передний буферы

 

 

Эти команды строят конус или его каркас высотой height и радиусом основания base, расположенный вдоль оси z. Основание находится в плоскости z=0.

 

Базовый примитив куб (GLUT)

void glutSolidCube(GLdouble size)

void glutWireCube(GLdouble size)

Рис. 8. Трехмерный куб

Команда glutSolidCube() строит куб, а glutWireCube() – каркас куба с центром в начале координат и длиной ребра (рис.8).

Базовый примитив конус (GLUT)

void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks)

void glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks)

Рис. 9. Трехмерный конус

Эти команды строят конус или его каркас высотой height и радиусом основания base, расположенный вдоль оси z. Основание находится в плоскости z=0.

2.2 Практическая часть создания трехмерного примитива

Дано:  В лабораторной работе требуется разработать программу на языке программирования С++ с использованием графической библиотеки OpenGL, которая создает конус GLU, вокруг которого вращаются куб GLUT и конус GLUT.

Ход работы:

#include "glut.h"

GLint Width = 500, Height = 500;

static float Alfa = 5, Betta = 0, Gamma = 0;

void Display(void)

{

GLUquadricObj *quadObj;

quadObj = gluNewQuadric();

glClearColor(0, 0, 0, 1);

 

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity(); // Загрузим единичную матрицу видового преобразования

    // Применим матрицу вида, заданную позицией камеры, точкой наблюдения

    // и вектором вверх

gluLookAt(100.0f, 100.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

 

glPushMatrix;

Alfa += 0.05f;

glRotatef(Alfa, 0.0f, 1.0f, 0.0f);

glTranslated(0,0,0);

gluQuadricDrawStyle(quadObj, GLU_LINE);

gluCylinder(quadObj,0,10,25,10,10);

glPopMatrix;

 

              glPushMatrix;

              Betta += 0.05f;

              glRotatef(Betta, 0.0f, 1.0f, 0.0f);

              glTranslated(0,0,50);

              gluQuadricDrawStyle(quadObj, GLU_LINE);

              glutWireCone(20,30,20,30);

              glPopMatrix;

 

glPushMatrix;

Gamma += 0.1f;

glRotatef(Gamma, 0.0f, 1.0f, 0.0f);

glTranslated(80,0,0);

gluQuadricDrawStyle(quadObj, GLU_LINE);

glutWireCube(25);

glPopMatrix;

 

glutSwapBuffers();

}

void Reshape(GLint w, GLint h)

{

Width = w; Height = h;

glViewport(0, 0, w, h);

 

glMatrixMode(GL_PROJECTION);

 

glLoadIdentity();

 

gluPerspective(65.0f, w/h, 1.0f, 1000.0f);

glMatrixMode(GL_MODELVIEW);

}

int main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitWindowSize(Width, Height);

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

glutCreateWindow("OpenGL");

 

glutIdleFunc(Display);

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutMainLoop();

}

 

 

 

Рис. 10. Результирующее трехмерное изображение

В результате работы программы получаем трехмерное изображение (рис.10), для построения которого использовались такие базовые примитивы, как конус GLU, куб GLUT и конус GLUT.


3 Построение криволинейных поверхностей и работа с клавиатурой

3.1 Теоретическая часть создания криволинейной поверхности

Процесс разбиения полигональной области со сложной конфигурацией в набор треугольников называется триангуляцией.

Методы триангуляции в OpenGL

В одном из самых распространенных программных интерфейсов (API) для разработки приложений в области двумерной и трехмерной графики стандарте OpenGL для формирования триангуляционной сетки используются следующие команды:

GL_TRIANGLES. Треугольники. Команда рисует серию треугольников, используя тройки вершин v0, v1 и v2, затем v3, v4 и v5 и т.д. Если количество вершин не кратно 3, оставшиеся точки игнорируются. Команду удобно использовать при описании поверхности, которая в результате тесселяции представляется кроме треугольников и другими геометрическими фигурами, например, прямоугольниками. В этом случае треугольники могут быть не соприкасаться между собой. Команда может использоваться для описания всех треугольников полигона, независимо от того, связаны они или нет между собой, однако из-за дублирования информации о координатах общих вершин память используется нерационально.

GL_TRIANGLE_STRIP. Полоса треугольников. Команда рисует серию треугольников, используя вершины в следующем порядке: v0, v1, v2, затем v2, v0, v3, затем v2, v3, v4, и т. д. При таком подходе каждая следующая вершина вместе с двумя предыдущими задает треугольник. Порядок вершин должен гарантировать, что треугольники имеют правильную ориентацию. Полоса может использоваться для формирования части поверхности.

GL_TRIANGLE_FAN. Команда похожа на рассмотренную команду выше, но при формировании треугольников используют вершины в таком порядке: v0, v1, v2, затем v0, v2, v3, затем v0, v3, v4, и т. д. Все треугольники имеют общую вершину v0. Команда позволяет разбить n-угольник на n-2 треугольника. Для этого нужно выбрать одну из n вершин полигона и соединить ее с каждой из n-3 несоседних вершин.

MapSize - размер матрицы карты высот и количество полигонов поверхности. Координаты положения узлов сетки полигонов задаются переменными x и y, а высота соответствующим элементом двухмерной матрицы HeightMap[0..MapSize-1, 0..MapSize-1]. Переменная Zoom отвечает за размер полигона создаваемой поверхности.

Обработка ввода с клавиатуры

Библиотека GLUT поддерживает взаимодействие с пользователем с помощью, так называемых функций с обратным вызовом (callback function). Если пользователь подвинул мышь, нажал на кнопку клавиатуры или изменил размеры окна, происходит событие и вызывается соответствующая функция пользователя – обработчик событий (функция с обратным вызовом).

Одним из вариантов может стать использование функции с операторами условия (if):

void Keyboard( unsigned char key, int x, int y ) // функция обработки сообщений с клавиатуры

{

              if (key == 97) Angle += 1;  // "a" влево

              if (key == 100) Angle -= 1; // "d" вправо             

}

Вызов процедуры обработки ввода с клавиатуры осуществляется с помощью команды – glutKeyboardFunc(Keyboard).


3.2 Практическая часть создания криволинейной поверхности

Дано: В лабораторной работе требуется разработать программу на языке программирования С++ с использованием графической библиотеки OpenGL и функции с обратным вызовом, которая создает трехмерную каркасную поверхность в соответствии с задачей: матрица a (15, 15) и b (15,15) сформированны случайным образом (интервал выбора случайных чисел от    0 до 0,8). Найти произведение матриц a и b, записать результат в массив х (15,15) и поменять местами в полученном массиве вторую и четвертую строки. Построить трехмерную поверхность по карте высот заданной матрицей х (15,15) и реализовать вращение полученной сцены с использованием клавиш клавиатуры «u» и «p».

Ход работы:

#include "stdlib.h"

#include <time.h>

#include "glut.h"

GLint Width = 500, Height = 500;

static float Angle = 0;

static float Zoom = 4;

float HeightMap[15][15];

float MapSize = 15;

void Function(float (*Map)[15])

{

float a[15][15], b[15][15];

float buf;

int i,j;

 

//Ввод матрицы А (15,15)

for (int i=1; i< MapSize; i++)

{

for (int j=1; j< MapSize; j++)

{

a[i][j] = -10 + rand()%10;

b[i][j] = -10 + rand()%10;;

Map[i][j] = a[i][j] * b[i][j];

}

}

 

for (i=0; i< MapSize; i++)

{

for (j=0; j< MapSize; j++)

 

 

// меняем местами

buf = Map[2][j];

Map[2][j] = Map[4][j];

Map[4][j] = buf;

 

}

void Display()

{

glClearColor(0, 0, 0, 1);

Angle += 0.0f;

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();

gluLookAt(100.0f, 100.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 50.0f);

glRotatef(Angle, 5.0f, 0.0f, 10.0f);

glTranslated(5,0,30);

for (int i= 0;i<MapSize-1;i++)

{

for (int j=0;j<MapSize-1;j++)

{

float x=i*Zoom;

float y=j*Zoom;

glLineWidth(2);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_TRIANGLE_STRIP);

glVertex3f(x, y, HeightMap[i][j]);

glVertex3f(x+Zoom, y, HeightMap[i+1][j]);

glVertex3f(x, y+Zoom, HeightMap[j+1][i]);

glVertex3f(x+Zoom, y+Zoom, HeightMap[i+1][j+1]);

glEnd();

}

}

glutSwapBuffers();

}

void Reshape(GLint w, GLint h)

{

Width = w; Height = h;

glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(65.0f, w/h, 1.0f, 1000.0f);

glMatrixMode(GL_MODELVIEW);

}

// Функция обработки сообщений с клавиатуры             

void Keyboard( unsigned char key, int x, int y )

{

if (key == 97) Angle += 1; // "u" влево

if (key == 100) Angle -= 1; // "p" вправо

}

 

void main()

{

srand(time(0));

Function(HeightMap);

glutInitWindowSize(Width, Height);

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

glutCreateWindow("OpenGL");

glutIdleFunc(Display);

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutKeyboardFunc(Keyboard);

glutMainLoop();

}

 

 

 

Рис. 11. Результирующее изображение

 

 

Рис. 12. Результирующее изображение

В результате работы программы получаем криволинейную поверхность (рис.11, 12),  для построения которой использовался массив и карта высот. Управление поверхностью осуществляется при помощи клавиш клавиатуры.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заключение

        В проведенной курсовой работе я разработала графические приложения  с использованием библиотеки OpenGL.

        Были изучены  базовые двухмерные и трехмерные примитивы OpenGL и созданы двухмерные и трехмерные статистические  сцены, а также  создана  криволинейная поверхность и  добавлен эффект  анимации.

С помощью программы проведены расчеты, проанализированы полученные результаты. Анализ показал, что поставленные задачи  решены   верно.

 


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

1.        Баяковский, Ю. М. Графическая библиотека OpenGL. Учебно-методическое пособие / Ю. М. Баяковский, А. В. Игнатенко, А. И. Фролов. – М. : МГУ им. Ломоносова, 2003. – 132 с.

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

3.        Дональд, Х. Компьютерная графика и стандарт OpenGL / Х. Дональд, М. Паулин Бейкер. – М. : Вильямс, 2005. – 1168 с.

4.        Серба А. Ландшафт шаг за шагом [Электронный ресурс]. – Режим доступа: http://www.gamedev.ru/code/articles/

5.        Романюк А., Сторчак А. Алгоритмы триангуляции [Электронный ресурс]. – Режим доступа: http://www.citforum.ru

6.        Девис, Т. OpenGL. Руководство по программированию / Т. Девис, М. Ву, Дж. Нейдер, Д. Шрайнер. – СПб. : Питер, 2006. – 624 с.

 

 

 

 

 

 

 

 

 

 

 

3

 



Информация о работе Разработка графических приложений с использованием библиотеки OpenGL