Построение 3D модели "Компьютер" (OpenGL)

Автор работы: Пользователь скрыл имя, 17 Октября 2013 в 15:40, курсовая работа

Краткое описание

В некоторых библиотеках OpenGL (например под X Windows) имеется возможность изображать результат не только на локальной машине, но также и по сети. Приложение, которое вырабатывает команды OpenGL называется клиентом, а приложение, которое получает эти команды и отображает результат - сервером. Таким образом, можно строить очень мощные воспроизводящие комплексы на основе нескольких рабочих станций или серверов, соединённых сетью.

Содержание

Введение
1. Программирование с использованием библиотеки OpenGL 4
1.1 Назначение OpenGL 4
1.2 Архитектура OpenGL 5
1.3 Преимущества OpenGL 6
1.4 Базовые возможности библиотеки 7
1.5 Преобразование координат 8
1.6 Видовое преобразование 9
1.7 Проекции 10
1.8 Трехмерные объекты GLU 11
1.9 Использование таймера 12
2. Разработка приложения для построения динамического изображения трехмерной модели объекта «Компьютер» 15
2.1 Разработка процедуры визуализации трехмерной сцены 15
2.2 Разработка интерфейса пользователя 17
2.3 Разработка подсистемы управления событиями 18
3. Информационное и программное обеспечение 20
3.1 Общие сведения о программе 20
3.2 Функциональное назначение 20
3.3 Логическая структура и функциональная декомпозиция проекта 21
3.4 Требования к техническому обеспечению программы 23
3.5 Руководство пользователя 23
ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

Прикрепленные файлы: 1 файл

Kursovaya_Rabota_Seidildayeva nazerke.docx

— 58.86 Кб (Скачать документ)

2. Использование B-сплайнов  для рисования кривых по опорным  точкам.

3. Видовые и модельные  преобразования, позволяющие вращать  объекты, располагать их в пространстве, изменять форму, а также изменять  положение камеры, из которой  ведется наблюдение.

4. Работа с цветом. OpenGL предоставляет возможности работы  с цветом в режиме RGBA или используя  индексный режим, где цвет выбирается  из палитры.

5. Удаление невидимых  линий и поверхностей.Z-буферизация.

6. Двойная буферизация,  позволяющая устранить мерцание  при мультипликации (изображение  каждого кадра сначала рисуется  во втором буфере, а потом, когда  кадр полностью нарисован, весь  буфер отображается на экран).

7. Наложение текстуры.

8. Сглаживание (позволяет  скрыть ступенчатость).

9. Освещение (задавать  источники освещения, их расположение, интенсивность).

10. Атмосферные эффекты,  такие как дым, туман.

11. Прозрачность объектов.

12. Использование списков  изображений.

Для упрощения работы с OpenGL существуют вспомогательные библиотеки: GLU (в библиотеку вошли функции  для работы со сплайнами, реализованы  дополнительные операции над матрицами  и дополнительные виды проекций), GLUT (предоставляет функции для работы с окнами, клавиатурой и мышкой), GLAUX (во многом схожа с библиотекой GLUT, но немного отстает по своим  возможностям).

1.5 Преобразование координат

В OpenGL каждая вершина задается четырьмя координатами, что связано  с использованием однородных координат. В однородных координатах положение  точки P (x, y, z) записывается как P (W Ч x, WЧ y, WЧz, W).

Для преобразования координат  используется матричное представление. В OpenGL существует три типа матриц - видовая, проекций и текстуры. Все они имеют  размер 4 Ч4 . Для того, чтобы с какой-либо матрицей можно было работать ее нужно  сделать текущей, для чего предусмотрена  команда: void glMatrixMode(GLenum mode). Параметр mode определяет, с каким набором матриц будут выполняться последующие операции, и может принимать одно из следующих значений: GL_MODELVIEW (последовательность операций над матрицами применяется к видовой матрице), GL_PROJECTION (последовательность операций над матрицами применяется к матрице проекций), GL_TEXTURE (последовательность операций над матрицами применяется к матрице текстуры).

После того как установлена  текущая матрица, необходимо определить ее значения. В данном случае полезной может оказаться функция void glLoadIdentity(), которая заменяет текущую матрицу  на единичную.

1.6 Видовое преобразование

Для формирования матрицы  преобразований можно воспользоваться  готовыми командами:

1. Вращение: void glRotate[f,d](GLtype angle, GLtype x, GLtype y, GLtype z). Эта команда рассчитывает  матрицу для выполнения вращения  вектора против часовой стрелки  на угол, определяемый параметром angle, осуществляемого относительно  точки (x, y, z). После выполнения  этой команды все объекты изображаются  повернутыми.

2. Параллельный перенос: void glTranslate[f,d](GLtype x, GLtype y, GLtype z). При помощи  этой команды осуществляется  перенос объекта на расстояние x по оси Х, на расстояние y по  оси Y и на расстояние z по оси  Z.

3. Масштабирование: void glScale[f,d]( GLtype x, GLtype y, GLtype z). Осуществляет частичное  масштабирование вдоль каждой  из координатных осей на значения, определяемые соответствующими  параметрами.

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

1.7 Проекции

В OpenGL поддерживаются такие  виды проекций как ортографическая  и перспективная. Ортографическая (параллельная) проекция представляет пространство параллелепипедом и размер изображаемых фигур не зависит  от расстояния, на котором они находятся. Объем отсечения для ортографической  проекции представлен на рисунке 1.

Рисунок 1 - Объем отсечения  ортографической проекции

Перспективная проекция моделирует пространство четырех угольной усеченной  призмой и в ней удаленный  объект кажется меньше, чем такой  же, но расположенный ближе. Объем  отсечения для перспективной  проекции представлен на рисунке 2.

Рисунок 2 - Объем отсечения  перспективной проекции

1.8 Трехмерные объекты GLU

Создание glu объекта сводится к следующим этапам:

1. Создание объекта типа GLUquadricObj командой gluNewQuadric.

2. Установка свойств созданного  объекта командой gluQuadricDrawStyle.

3. Рисование объекта.

4. Удаление объекта командой gluDeleteQuadric.

При программировании с использованием glu доступны следующие команды: void gluQuadricDrawStyle (GLUquadric * qObject,GLenum drawStyle) ,где qObject - указатель  на quadric объект; drawStyle - стиль вывода трехмерного объекта. Возможные  значения параметра drawStyle : GLU_FILL - сплошной объект, GLU_LINE - каркасный объект, GLU_POINT - рисуются только точки.

Рассмотрим команды:

1) рисования цилиндра:

void gluCylinder (GLUquadric * qobj,GLdouble baseRadius,GLdouble topRadius, GLdouble height, GLint slices,GLint stacks), где  qObject - указатель на quadric объект; baseRadius - радиус первого основания; topRadius - радиус второго основания; height - высота; slices -количество слоев; stacks - количество секторов;

2) рисования диска:

void gluDisk (GLUquadric * qobj,GLdouble innerRadius, GLdouble outerRadius, GLint slices,GLint loops), где qObject - указатель на quadric объект; innerRadius - внутренний  радиус; s outerRadiu - внешний радиус; slices - количество слоев; loops - количество  огибающих;

3) рисования дискового  сектора:

void gluPartialDisk (GLUquadric * qobj,GLdouble innerRadius, GLdouble outerRadius,GLint slices, GLint loops,GLdouble startAngle, GLdouble endAngle), где startAngle - начальный  угол; endAngle - конечный угол сектора;

4) рисования сферы:

void gluSphere (GLUquadric * qobj,GLdouble radius,GLint slices, GLint loops).

2. РАЗРАБОТКА ПРИЛОЖЕНИЯ  ДЛЯ ПОСТРОЕНИЯ ДИНАМИЧЕСКОГО  ИЗОБРАЖЕНИЯ ТРЕХМЕРНОЙ МОДЕЛИ  ОБЪЕКТА «КОМПЬЮТЕР».

2.1 Разработка  процедуры визуализации трехмерной  сцены

Прорисовка в рабочей  области начинается с метода void CLab1View::OnDraw(CDC* pDC), в котором вызывается функция usr_RenderScene (). Она отвечает за прорисовку функциональных частей и за некоторые  важные расчёты, которые связаны  с расположением некоторых отдельных  деталей. Модель состоит из геометрических примитивов, таких как цилиндр, параллелепипед, дисковой сектор.

Рисование 3D объекта начинается с установления формата пикселей и области вывода в методах BOOL CLab1View::usr_setuppixelformat() и void CLab1View::usr_Resize(int x, int y, int width, int heidht) соответственно. Рассмотрим подробнее метод usr_RenderScene (), код которого представлен в приложении Б. В  этом методе начинается прорисовка объекта. Модель рисуется с верхней ее части, а именно рисуем монитор компьютера - параллелепипед со сторонами 0,7, 0,4, 1,1 - auxSolidBox((GLfloat)0.7,0.4,1.1). Роль подставки  монитора выполняет целый ряд  отдельных деталей, каждая из которых  рисовалась после переноса координат  на необходимую величину. Первым создан цилиндр со следующими параметрами - основания 0,25 и 0,25, длина 0,2. Следующий  объект - дисковый сектор, нарисован  с использованием функции gluDisk (quadric, 0,0.25,16,1). Далее еще один диск, он имеет  те же параметры, что и первый. Эти  диски были использованы для закрытия пустот. После прорисовки этих элементов  переносим координаты функцией glTranslatef(0.0,0.0,-0.4). Рисуем еще один цилиндр с основаниями  по 0.15 - gluCylinder (quadric, 0.15, 0.15, 0.3, 100,40), вновь  переносим координаты с использованием glTranslatef и рисуем изображение на мониторе компьютера с помощью функции auxSolidBox((GLfloat)1,0.03,1.38).

На данном этапе модель представлена в незаконченном виде без таких важных составляющих как: системный блок, клавиатура, звуковые колонки и, конечно же, стол, на котором  располагается любой обычный  персональный компьютер.

Переносим координаты и рисуем крышку стола, на котором стоит монитор  с помощью функции auxSolidBox((GLfloat)2.2,2.6,0.3). Далее снова функция - glTranslatef (0,0.5,-0.1) и помощью auxSolidBox рисуем клавиатуру компьютера, находящуюся на столе  перед монитором. Далее были нарисованы остальные части компьютерного  стола, с помощью следующих функций: glTranslatef(1.1,0.235,2.7), glTranslatef(-2.2,0,0), glTranslatef(-1.6,0,0), glTranslatef (0.3,0.25,1). Размеры этих элементов  заданы в функциях - auxSolidBox((GLfloat)0.09,2.6,2.5),auxSolidBox((GLfloat)0.09,2.6,2.5), auxSolidBox((GLfloat)0.07,2.6,2.5), auxSolidBox((GLfloat)0.6,2.03,0.1).

Затем рисуются два параллелепипеда, которые представляют собой системный  блок компьютера. Для самого блока  выбраны следующие параметры: auxSolidBox((GLfloat)0.3,1.4,1.5). Для дисковода: auxSolidBox(0.5,0.5, 0.05). Дисковод анимирован, при нажатии управляющей  кнопки он выдвигается и задвигается. Это реализовано с помощью  функции - glTranslatef(1.54, l, 1.5), l - переменная, которая изменяется со временем.

И, наконец, для придания модели завершенного вида, необходимо дорисовать звуковые колонки, для этого:

- сначала требуется провести  смещение системы координат (для  отображения в нужном месте);

- рисование цилиндра (задняя  часть колонки);

- рисование параллелепипеда  (передняя часть);

- рисование дискового  сектора (верхняя часть).

Все необходимые операции производятся теми же функциями glTranslatef, auxSolidBox, gluCylinder, gluDisk.

Весь код метода usr_RenderScene() представлен в приложении А.

2.2 Разработка  интерфейса пользователя

Для данной программы разработан интерфейс, позволяющий:

- включать и выключать  эффект тумана;

- выбирать тип тумана;

- включать и выключать  дисковод;

- вращать компьютер;

- задавать скорость и  вид движения компьютера;

- выбирать тип и задавать  параметры перспективы

- приближать и удалять  объект с помощью мышки.

Для добавления данных возможностей было отредактирована панель инструментов приложения, а именно

- добавлена кнопка «Перспектива»;

- добавлена кнопка «Движение».

У всех кнопок имеются всплывающие  подсказки, а также подсказки, которые  появляются в строке состояния.

В главном меню добавлены  пункты:

- «Режим тумана» («View»  « Режим тумана») - запуск диалогового  окна выбора типа тумана.

- «Выключить туман» («View»  « Выключить туман») - устранение  эффекта тумана.

- «On\Off» («Move» « On\Off ») - включать и выключать дисковод.

Приложение имеет интуитивно понятный интерфейс, с которым удобно работать.

2.3 Разработка  подсистемы управления событиями

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

Таким образом, разработка подсистемы управления событиями занимает особое место в общей системе разработки приложения. К основным событиям, обеспечивающим корректную работу программы, относят:

- WM_DESTROY - освобождение занятых  ресурсов;

- WM_SIZE - изменения сцены  относительно размеров окна;

- WM_ERASEBKGND - предотвращения  мерцания;

- WM_TIMER - используется для  создания таймера;

- WM_MOUSEWHEEL - обработка вращения  колеса мышки;

- WM_KEYDOWN - обработка нажатия  клавиши;

- COMMAND(ID_PERSP, CKarkasView::OnPersp ()) - обработка  события при вызове окна настройки  перспективы;

- COMMAND(ID_OPTIONS, CKarkasView::OnOptions ()) - обработка события при вызове  окна настройки типа вращения  и скорости движения объекта;

- COMMAND(ID_VIEW_1, CKarkasView::OnView1())- обработка  события выбора типа тумана;

- COMMAND(ID_VIEW_SBROS, CKarkasView:: OnVewSbros()) - обработка события нажатия кнопки  «Убрать туман»;

- COMMAND (ID_VIEW_MOVE, CKarkasView::OnMove ()) - обработка нажатия кнопки «Движение».

3. ИНФОРМАЦИОННОЕ И ПРОГРАММНОЕ  ОБЕСПЕЧЕНИЕ

3.1 Общие сведения  о программе

Программа называется «Трехмерная  модель Компьютера». При работе с  данной программой у пользователя есть возможность работать с визуальной моделью данного объекта. Вращать  ее относительно осей, включать и выключать  эффект тумана, а также задавать тип тумана, приближать и удалять  с помощью колеса мышки, включать и выключать вращение модели и  устанавливать скорость вращения, а  также имеется возможность управления дисководом. Программное обеспечение, на котором разработана приложение - Microsoft Visual С++ 6.0 с использованием библиотеки OpenGL.

3.2 Функциональное  назначение

Данное приложение обеспечивает следующие возможности:

- изменение положения  объекта в пространстве (перемещение  относительно осей);

- приближение и удаление  объекта;

- включение и выключение  эффекта тумана;

- выбор типа тумана;

- изменение проекции;

- управление дисководом;

- включение и выключение  вращения сцены;

- установка скорости вращения  сцены.

3.3 Логическая структура  и функциональная декомпозиция  проекта

Инициализация OpenGL происходит в несколько этапов.

1. Выбираем и устанавливаем  формат пикселей. В информации  о формате пикселей указывается  такая информация как глубина  цвета, различные флаги поверхности.  Вся эта структура представляется  в специальной структуре PIXELFORMATDESCRIPTOR. Далее передаем на рассмотрение  операционной системе, выбранный  формат пикселей. После того, как  система просмотрит его, она  выберет наиболее совпадающий  формат с тем, который поддерживается  в контексте устройства. Функцией, осуществляющей такого рода проверку, является ChoosePixelFormat(). После выбора  формата пикселей функция SetPixelFormat() устанавливает его в контексте  устройства.

2. Создаем контекст вывода  для библиотеки OpenGL. Данный контекст  создается с помощью функции  wglCreateContext(), далее функция wglMakeCurrent() устанавливает текущий контекст. Функция wglGetCurrentDC() необходима для  корректного завершения приложения, а wglGetCurrentDC() - для удаления контекста  воспроизведения.

Информация о работе Построение 3D модели "Компьютер" (OpenGL)