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

Создание программы на языке C++ с использованием графических библиотек OpenGL в среде Microsoft Visual Studio. Построение динамического изображения трехмерной модели объекта "Нефтяная платформа". Логическая структура и функциональная декомпозиция проекта.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 23.06.2011
Размер файла 1,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

"СЕВЕРО-КАВКАЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ"

Кафедра информационных систем и технологий

Пояснительная записка

к курсовой работе

по дисциплине

"Компьютерная геометрия и графика"

на тему: Разработка приложения с использованием OpenGL для построения динамического изображения трехмерной модели объекта "Нефтяная платформа"

Ставрополь, 2011

Аннотация

Программа написана на языке программирования C++ с использованием графических библиотек OpenGL и библиотеки классов MFC. В качестве среды разработки использовалась Microsoft Visual Studio 6. Эта среда программирования является достаточно мощным инструментом разработчика, и позволят целиком сосредоточить внимание на написании программы, не отвлекаясь на изучение оболочки.

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

Содержание

  • ВВЕДЕНИЕ
  • 1. Программирование с использованием библиотеки OpenGL
    • 1.1 Программный код OpenGL
    • 1.2 Синтаксис команд OpenGL
    • 1.3 OpenGL как конечный автомат
    • 1.4 Конвейер визуализации OpenGL
  • 2. Разработка приложения для построения динамического изображения трехмерной модели объекта "нефтяная платформа"
    • 2.1 Инициализация библиотеки OpenGL
    • 2.2 Проектирование трехмерной модели и настройка параметров отображения сцены
    • 2.3 Разработка инструментов управления настройками приложения
    • 2.4 Обработка событий
  • 3. Информационное и программное обеспечение
    • 3.1 Общие сведения о программе
    • 3.2 Функциональное назначение
    • 3.3 Логическая структура и функциональная декомпозиция проекта
    • 3.4 Требования к техническому и программному обеспечению
    • 3.5 Руководство пользователя
  • Заключение
  • Список литературы
  • Приложение

ВВЕДЕНИЕ

Библиотека OpenGL представляет собой программный интерфейс для аппаратного обеспечения машинной графики. Этот интерфейс состоит приблизительно из 250 отдельных команд (почти 200 команд в ядре OpenGL и еще 50 команд в библиотеке утилит OpenGL), которые используются для того, чтобы определить объекты и операции, необходимые для создания интерактивных трехмерных прикладных программ. Библиотека OpenGL разработана в качестве низкоуровневого, аппаратно-независимого интерфейса, допускающего реализацию на множестве различных аппаратных платформ. Для того чтобы достичь этих качеств, в состав библиотеки OpenGL не включены никакие команды для выполнения задач работы с окнами или для получения пользовательского ввода; вместо этого вы должны работать через любую систему управления окнами, которая работает с конкретными аппаратными средствами. Также библиотека OpenGL не предоставляет команды высокого уровня для описания моделей трехмерных объектов. Такие команды могли бы позволить определять относительно сложные формы, например, автомобили, части тела, самолеты или молекулы. При использовании библиотеки OpenGL возможно только создавать нужную модель из ограниченного набора геометрических примитивов -- точек, линий и многоугольников. Более сложная библиотека, которая обеспечивает эти функциональные возможности - библиотека утилит GLU (OpenGL Utility Library) предоставляет множество возможностей моделирования, таких как поверхности второго порядка и NURBS-кривые и поверхности (NURBS -- неравномерный рациональный В-сплайн). Библиотека GLU представляет собой стандартную часть каждой реализации OpenGL. Существуют также наборы инструментов более высокого уровня, такие как FSG (Fahrenheit Scene Graph), которые являются надстройкой библиотеки OpenGL, и самостоятельно доступны для множества реализаций библиотеки OpenGL.

1. Программирование с использованием библиотеки OpenGL

1.1 Программный код OpenGL

Основная структура программы может быть проста: ее задачи состоят в том, чтобы инициализировать некоторые состояния, которые управляют тем, как библиотека OpenGL выполняет визуализацию, и определить объекты, которые будут визуализированы. Визуализация представляет собой процесс, посредством которого компьютер создает изображения из моделей. Эти модели, или объекты, создаются из геометрических примитивов, -- точек, линий и многоугольников, -- которые определяются их вершинами. [7]

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

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

1.2 Синтаксис команд OpenGL

Команды библиотеки OpenGL используют префикс gl. Каждое слово, составляющее наименование команды, начинается с заглавной буквы (например, glClearColor()). Точно так же имена констант, определенных в библиотеке OpenGL, начинаются с префикса GL_, записываются целиком заглавными буквами и используют символы подчеркивания, чтобы разделить отдельные слова (например, GL__COLOR_BUFFER_BIT).

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

Таблица 1.1 - Типы OpenGL

Суффикс

Описание

Тип в С

Тип в OpenGL

b

8-разрядное целое

signed char

GLbyte

s

16-разрядное целое

short

GLshort

i

32-разрядное целое

Int

long

GLint, GLsizei

f

32-разрядное число

с плавающей точкой

float

GLfloat, GLclampf

d

64-разрядное число

с плавающей точкой

double

GLdouble, GLclampd

ub

8-разрядное беззнаковое целое

unsigned char

GLubyte, GLboolean

us

16-разрядное беззнаковое целое

unsigned short

GLushort

ui

32-разрядное беззнаковое целое

unsigned int

unsigned long

GLuint, GLenum, GLbitfield

Таким образом, две команды glVertex2i (1,3); glVertex2f (1.0f, 3.0f); являются эквивалентными, за исключением того, что первая из них определяет координаты вершины как 32-разрядные целые числа, а вторая определяют их как числа с плавающей точкой с одинарной точностью. [1]

Наименования некоторых команд библиотеки OpenGL могут иметь заключительный символ v, который указывает на то, что данная команда принимает указатель на вектор (или массив) значений, а не набор индивидуальных параметров. Много команд имеют как векторные, так и невекторные версии, но некоторые команды принимают только индивидуальные параметры, тогда как другие команды требуют, чтобы, по крайней мере, некоторые из их параметров были определены как векторы. Следующие строки показывают, как можно было бы использовать векторную и невекторную версию команды, которая устанавливает текущий цвет:

glColor3f (1.0, 0.0, 0.0);

GLfloat color_array [ ] = {1.0, 0.0, 0.0); glColor3fv (color_array);

Наконец, библиотека OpenGL определяет тип данных GLvoid. Этот тип данных наиболее часто используется для тех команд библиотеки OpenGL, которые принимают в качестве параметров указатели на массивы значений.

1.3 OpenGL как конечный автомат

Графическая система OpenGL представляет собой конечный автомат. В ходе работы этот автомат переводится в различные состояния (или режимы), которые затем остаются в силе до тех пор, пока вы не будут изменены. Например, текущий цвет представляет собой переменную состояния. Можно установить в качестве текущего белый, красный, или любой другой цвет, и после этого каждый объект будет выводиться на экран с этим цветом до тех пор, пока для текущего цвета не будет установлено какое-нибудь другое значение. Текущий цвет является лишь одной из множества переменных состояния, которые поддерживает библиотека OpenGL. Другие переменные состояния управляют такими вещами, как текущая визуализация и преобразования проецирования, шаблоны штриховки линий и многоугольников, режимы вывода многоугольников на экран, соглашения по упаковке пикселей, местоположение и характеристики источников освещения, а также свойства материалов объектов, выводимых на экран. Множество переменных состояния относятся к режимам, которые включаются или отключаются с помощью команд glEnable() или glDisable() соответственно.

Каждая переменная состояния или режим имеют значение по умолчанию, и в любой момент времени можно запросить у системы текущие значения каждой из этих переменных. Как правило, для этого используется одна из шести команд: glGetBooleanv( ), glGetDoubIev( ), glGetFloatv( ), glGetlntegerv( ), glGetPointerv( ) или gIIsEnabled( ). To, какую из этих команд следует выбрать, зависит от того, в виде какого типа данных необходимо получить ответ. Для некоторых переменных состояния используются более конкретные команды запроса (такие как glGetLight*( ), glGetError( ) или glGetPolygonStipple( )). Кроме этого, можно сохранить набор переменных состояний в стеке атрибутов с помощью команд glPushAttrib( ) или gIPushCIientAttrib( ), временно изменить их, а затем восстановить значения этих переменных с помощью команд glPopAttrib ) или glPopClienlAttrib( ). Для временных изменений состояния необходимо использовать именно эти команды, а не любые из команд запроса, так как они более эффективны. [4]

1.4 Конвейер визуализации OpenGL

Большинство реализаций библиотеки OpenGL имеет одинаковый порядок операций, определенную последовательность стадий обработки, которая называется конвейером визуализации OpenGL. Этот порядок функционирования, показанный на рисунке 1.1, не является строгим правилом реализации библиотеки OpenGL, однако он представляет собой надежное руководство для предсказания результата работы OpenGL.

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

Рисунок 1.1 - Типовой конвейер OpenGL

Функционирование конвейера можно разбить на несколько основных стадий:

1. Списки вывода. Все данные, вне зависимости от того, описывают ли они геометрию или пиксели, могут быть сохранены в списке вывода для текущего или более позднего использования (альтернативой сохранению данных в списке вывода является немедленная обработка данных, она также известна под названием непосредственный режим работы). После того как список вывода был создан, сохраненные данные посылаются из этого списка вывода точно так же, как если бы они были посланы прикладной программой в непосредственном режиме работы. [4]

2. Вычислители. Все геометрические примитивы, в конечном счете, описываются вершинами. Параметрические кривые и поверхности могут быть первоначально описаны контрольными точками и полиномиальными функциями, которые называются базовыми функциями. Вычислители предоставляют метод получения вершин, используемый для представления поверхности по контрольным точкам. Таким методом является полиномиальное отображение, которое может формировать нормаль к поверхности, координаты текстуры, цвета и значения пространственных координат по контрольным точкам. [4]

3. Операции обработки вершин. Для данных по вершинам следующей является стадия "операций обработки вершин", которая преобразовывает вершины в примитивы. Некоторые типы данных по вершинам (например, пространственные координаты) преобразовываются в матрицы чисел с плавающей точкой размером 4x4. Пространственные координаты проецируются из положения в трехмерном пространстве в положение на экране.

Если разрешено использование расширенных функциональных возможностей, то данная стадия обработки данных еще более насыщена. Если используется наложение текстур, то на этой стадии могут быть сгенерированы и преобразованы координаты текстуры. Если разрешено освещение, то здесь выполняются вычисления параметров освещения, для чего используются преобразованные вершины, нормаль к поверхности, положение источника освещения, свойства материала и другая информация освещения, необходимая для получения значения цвета. [8]

4. Сборка примитивов. Операция отсечения, основная часть сборки примитивов, представляет собой удаление частей геометрии, которые выходят за пределы полупространства, определенного некоторой плоскостью. При отсечении точек просто пропускаются или отбрасываются вершины; при отсечении линий или многоугольников могут добавляться дополнительные вершины в зависимости от того, как отсекается линия или многоугольник. В некоторых случаях этот процесс сопровождается перспективным делением, которое заставляет удаленные геометрические объекты казаться меньше, чем более близкие объекты. После этого применяются операции получения окна просмотра (Viewport) и глубины (z-координата). В зависимости от способа построения многоугольник может быть выведен на экран в виде точек или в виде линий.

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

5. Операции обработки пикселей. В то время как геометрические данные следуют одним путем по конвейеру визуализации OpenGL, пиксельные данные следуют другим маршрутом. Пиксели из определенного массива в системной памяти сначала распаковываются из какого-либо одного множества форматов в надлежащее количество компонентов. Затем эти данные масштабируются, смещаются и обрабатываются посредством карты элементов отображения. После этого результаты фиксируются и либо записываются в область памяти, выделенную под текстуры, либо передаются на стадию растеризации. Если пиксельные данные считываются из буфера кадра, то выполняются операции по передаче пикселя (масштабирование, смещение, отображение и фиксация). Затем полученные результаты упаковываются в соответствующий формат и возвращаются в некоторый массив системной памяти.

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

6. Сборка текстуры. OpenGL-приложения могут накладывать изображения текстуры на геометрические объекты для того, чтобы сделать их вид более реалистичным. Если используется несколько изображений текстуры, то весьма разумно будет поместить их в объекты текстуры для упрощения переключения между ними. Некоторые реализации библиотеки OpenGL могут иметь специальные ресурсы для ускоренного выполнения операций над текстурами. Это может быть реализовано как специализированная, высокопроизводительная область памяти, выделенная для текстур. Если такая память доступна, объекты текстуры могут быть упорядочены по приоритетам для облегчения управления этим ограниченным и ценным ресурсом. [9]

7. Растеризация. Растеризация представляет собой преобразование как геометрических, так и пиксельных данных во фрагменты. Каждый квадратный фрагмент соответствует определенному пикселю в буфере кадра. Штриховка линий и многоугольников, ширина линии, размер точки, модель закраски и вычисления покрытия, необходимые для поддержки сглаживания, учитываются как вершины, которые соединяются в линии, или как внутренние пиксели, рассчитанные для закрашенного многоугольника. Значения цвета и глубины назначаются для каждого квадратного фрагмента.

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

Первой операцией, с которой можно столкнуться, является наложение текстур. Эта операция заключается в том, что тексель (элемент текстуры) генерируется из памяти текстур для каждого фрагмента и применяется к конкретному фрагменту. После этого могут применяться вычисления тумана, которые сопровождаются альфа-тестом, тестом трафарета и тестом буфера глубины. Неудачное завершение включенного теста может прекратить длительную обработку квадрата фрагмента. Затем могут быть выполнены операции смешивания цветов, псевдосмешивания (размывания) цветов для передачи полутонов, логической обработки и маскирования с помощью битовой маски. Наконец, полностью обработанный фрагмент выводится в соответствующий буфер, где он окончательно превращается в пиксель и достигает своего конечного местоположения.

2. Разработка приложения для построения динамического изображения трехмерной модели объекта "Нефтяная платформа"

2.1 Инициализация библиотеки OpenGL

Первоначально необходимо подключить используемые свободно распространяемые библиотеки. Для этого в файле stdafx.h следует подключить заголовочные файлы, содержащие описания функций OpenGL, а именно: gl.h, glu.h, glaux.h, после чего следует в свойствах проекта прописать библиотеки, необходимые для работы с функциями OpenGL: opengl32.lib, glu32.lib, glaux.lib.

Процесс инициализации библиотеки OpenGL состоит из следующих этапов:

1. Выбор и установка формата пикселей. Здесь указывается такая информация как глубина цвета, флаги поверхности и т.д. Вся эта информация представляется в специальной структуре PIXELFORMATDESCRIPTOR. После заполнения полей структуры, необходимо установить в системе выбранный формат пикселей. На основании введенных данных выбирается наиболее подходящий формат пикселя из поддерживаемых в контексте устройства. После того, как система выбрала формат пикселей, необходимо установить его в контексте устройства.

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

2.2 Проектирование трехмерной модели и настройка параметров отображения сцены

Разработанную модель нефтяной платформы можно условно разбить на группы основных элементов:

1. Каркас:

- корпус платформы,

- помещения;

2. Буровая установка:

- бур,

- дополнительное оборудование,

- цистерны,

3. Опоры.

Фото прототипа разработанной модели, диаграмма классов и обобщенный алгоритм работы программы вынесены в приложение А. Листинг проекта вынесен в приложение Б.

Все элементы платформы выполнены с использованием объектов библиотеки AUX. Для построения модели используются стандартные примитивы этой библиотеки.

Во избежание сложностей в подборе координат все отдельные элементы сцены заключены в операторные скобки glPushMatrix( ), glPopMatrix( ).

Область вывода сцены на экран определена таким образом, что подстраивается под форму и размеры окна, при этом пропорции модели не искажаются. Проект предоставляет возможность самостоятельно настроить перспективу, но это делать не рекомендуется. По-умолчанию установлена перспектива gluPerspective( ) с специфичным для данного приложения набором параметров.

Сцена освещается одним источником света с различными параметрами набора свойств.

Анимационная составляющая модели представлена вращающейся буровой установкой. При нажатии на соответствующую кнопку "Q" на клавиатуре, буровая установка начинает вращаться.

При начальной инициализации проекта задается ряд параметров отображения сцены, в том числе:

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

- glEnable(GL_COLOR_MATERIAL): отрисовывать цветные поверхности;

- glEnable(GL_LIGHTING): pазpешает освещение сцены сpедствами OpenGL;

- glEnable(GL_NORMALIZE): создание нормалей к поверхностям;

- glEnable(GL_AUTO_NORMAL): режим автоматического вычисления нормалей;

- glEnable(GL_TEXTURE_2D): разрешает наложение текстур на объекты;

- glShadeModel (GL_SMOOTH): создает плавные тени при освещении;

- glPolygonMode(GL_FRONT_AND_BACK, PolygonMode): определяет стиль рисования полигонов, а именно: отрисовывать передние и задние поверхности, принцип соединения вершин (задается программно).

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

Для настройки многочисленных параметров приложения предусмотрено многофункциональное меню "Опции". Внешний вид этой экранной формы представлен на рисунке 2.2:

Рисунок 2.2 - экранная форма "Опции"

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

1. Вращение сцены. Возможно включить, или отключить вращение, задать плоскости в которых будет вращаться сцена, направления вращения, а также скорость вращения. Опция вращения реализуется двумя функциями glRotatef(XSceneRot,0,1,0), glRotatef(YSceneRot,1,0,0), расположенными перед всеми блоками рисования частей корабля, что позволяет поворачивать всю сцену целиком. Автоматическое вращение поддерживается благодаря созданию специального таймера с параметрами, зависящими от заданной скорости вращения;

2. Вращение буровой установки. Вращается по нажатию кнопки "Q" на клавиатуре;

3. Режим рисования полигонов. Позволяет задать соответствующий режим: будут ли отрисовываться поверхности, либо только линии, составляющие каркас, либо только точки. Осуществляется нажатием кнопки "W";

4. Цвет. Позволяет задать желаемые цвета для корпуса с опорами, строений и буровой установки. Выбор цвета осуществляется с помощью стандартного диалогового окна, реализуемого классом CColorDialog. По завершению работы этого диалога он возвращает код цвета в специальном формате COLORREF, после чего необходимо преобразовать его к стандартной палитре RGB с помощью функций GetRValue(color), GetGValue(color), GetBValue(color), а после чего преобразовать полученные значения к стандартам библиотеки OpenGL;

5. Свет. Позволяет задать любые комбинации из пяти доступных источников света. Задание свойств источников света достаточно трудоемкая процедура и требует определенных знаний от пользователя, в связи с чем, было решено запретить подобные изменения;

6. Туман. Возможно включить, или отключить туман, задать модель рисования тумана и его цвет. Интенсивность тумана принята 0,2 и не подлежит изменению.

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

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

Кроме всего вышеперечисленного пользователь может изменить перспективу с помощью окна, изображенного на рисунке 2.3, вызов которого осуществляется с панели инструментов приложения.

Рисунок 2.3 - Экранная форма настройки перспективы

Пользователь может выбирать один из четырех типов перспективы: glOrtho (ортографическая проекция), glFrustum (одноточечная перспективная проекция), gluPerspective (аналогично glFrustum), gluLookAt (позволяет определить ориентацию наблюдателя в пространстве). В зависимости от выбранного типа будет меняться набор доступных для редактирования текстовых полей.

2.4 Обработка событий

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

Существует несколько способов перехватить и обработать нажатия клавиш на клавиатуре. В проекте для этого используется обработчик события WM_CHAR: void CKarkasView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags). Чтобы определить какая именно клавиша нажата достаточно проверить передаваемый в функцию параметр nChar.

Для реализации вращения в вертикальной плоскости обрабатывается событие WM_MOUSEWHEEL функцией:

BOOL CKarkasView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt). Здесь параметр zDelta принимает значение соответствующее направлению вращения скроллера.

Кроме того, для создания анимации и автоматического вращения сцены требуется также обработать события, генерируемые таймерами. Для этого обрабатывается событие WM_TIMER функцией: void CKarkasView::OnTimer(UINT nIDEvent). Здесь следует учесть, что все таймеры приложения генерируют одинаковые события и обрабатываются одной функцией. Чтобы различать "авторов" сообщений в функцию передается параметр nIDEvent.

Вызов окон настройки, а также выстрел пушки осуществляются с помощью кнопок, расположенных на панели инструментов (рисунок 2.4).

Рисунок 2.4 - Панель инструментов приложения

Для обработки их нажатия используются соответственно функции: void CKarkasView::OnBum( ), void CKarkasView::OnOptions( ), void CKarkasView::OnPersp( ).

3. Информационное и программное обеспечение

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

В ходе выполнения курсовой работы было разработано однодокументное windows-приложение на основе OpenGL для построения динамического изображения трехмерной модели объекта "Нефтяная платформа". Программа написана на языке высокого уровня C++ в среде Microsoft Visual C++ 6.0 с использованием библиотеки классов MFC. Для функционирования программы на компьютере должны быть установлены свободно распространяемые графические библиотеки OpenGL: opengl32.lib, glu32.lib, glaux.lib.

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

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

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

Обобщенный алгоритм построения трехмерного объекта средствами OpenGL и диаграмма классов приложения представлены в приложении А.

В ходе объектно-ориентированной декомпозиции были выделены и описаны классы созданного приложения (таблица 3.1).

Таблица 3.1 - Описание классов приложения

Название класса

Описание класса

CLR1View

Отвечает за отображение содержания документа и графической информации. В данном случае методы именно этого класса отвечают за рисование модели нефтяной платформы и обработку событий;

CLR1Doc

Реализует основные возможности внутреннего представления документа. Этот класс используется для управления данными;

CLR1App

Класс, отвечающий за создание и инициализацию главного окна и опрос системных сообщений;

CMainFrame

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

DlgOptions

Класс диалогового окна, отвечающий за изменение многочисленных параметров приложения;

DlgPers

Класс диалогового окна, отвечающий за смену перспективы и настройку её параметров;

CAboutDlg

Класс диалогового окна справки.

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

Таблица 3.2 - Методы класса CLR1View

Название метода класса

Назначение

Usr_bInitOpenGL ( )

Функция инициализации библиотеки OpenGL;

Usr_bSetupPixelFormat ( )

Функция установки формата пикселей;

Usr_DestroyOpenGL ( )

Функция, освобождающая ресурсы по завершению работы приложения;

Usr_PreInit ( )

Функция, ответственная за включение режимов работы библиотеки, настройку освещения и т.д.

Usr_RenderScene ( )

Функция, отвечающая за отрисовку модели;

Usr_ReSize (int X, int Y, int width, int height )

Функция, отвечающая за поддержание параметров области вывода при изменении размеров и формы окна;

CKarkasView ( )

Конструктор класса;

OnChar (UINT nChar, … )

OnMouseWheel (short zDelta, …)

Функции, отвечающие за обработку нажатий клавиш на клавиатуре и вращения колеса мыши;

OnTimer (UINT nIDEvent)

Функция, обрабатывающая таймеры;

Cylinder ( )

Функция рисования сплошного или каркасного цилиндра

Cube ( )

Функция рисования сплошного или каркасного параллелограмма

программа графический библиотека декомпозиция

Таблица 3.3 - Переменные класса CLR1View

Название поля класса

Назначение

float m_AngleBur

Переменная, хранящая угол поворота буровой установки

BOOL b_RotateBur

Переменные, показывающая следует ли вращать буровую установку

BOOL m_Wire

Признак режима отображения полигонов

float m_UgolX

Угол поворота в вертикальной плоскости

BOOL m_NeedRotate

Признак, показывающий нужно ли вращать всю сцену

float m_Angle

Угол поворота всей сцены

int m_Timer

Идентификатор таймера

3.4 Требования к техническому и программному обеспечению

Для корректной работы приложения на компьютере должны быть установлена операционная система семейства Windows: Windows 2000 Service Pack 3, Windows Server 2003, Windows XP Service Pack 2, Windows Vista, Windows 7. Минимальные и рекомендуемые системные требования указаны в таблице 3.4.

Таблица 3.4 - Минимальные и рекомендуемые системные требования

Устройство

Минимальные системные требования

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

Процессор

600 МГц

1 ГГц

Оперативная память

192 МБ

256 МБ

Свободное место на жестком диске

100 МБ

100 МБ

Монитор

800 x 600

256 colors

1024 x 768

High Color - 16-bit

3.5 Руководство пользователя

Для запуска приложения необходимо скопировать в одну директорию исполняемый файл программы HeftPlat.exe, после чего запустить приложение.

Внешний вид основного окна приложения отражен на рисунке А.2.

1. По-умолчанию включены все источники света. Автоматическое вращение отключено. Режим полигонов - поверхности. Элементы платформы окрашены в различные цвета. Вызов окон настройки сцены и перспективы (рисунки 2.2 и 2.3), а также вращение буровой установки осуществляется нажатием кнопки "Q". Автоматическое вращение всей модели в горизонтальной плоскости осуществляется по нажатии кнопки "Пробел".

Заключение

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

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

Список литературы

1. The red book - http://www.glprogramming.com/red/;

2. The blue book - http://www.glprogramming.com/blue/;

3. Тихомиров Ю. OpenGL. Программирование трехмерной графики, -СПб.: "БХВ-Петербург", 2002;

4. Эдвард Энджел. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2-е издание. -М.: "Вильямс", 2001;

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

6. Ричард С. Райт, Бенджамин Липчак, Николас Хемел. OpenGL. Суперкнига, 4-е издание, -М.: "Вильямс";

7. Хилл, Ф. OpenGL. Программирование компьютерной графики. Для профессионалов, -СПб.: "Питер", 2004;

8. Мешков, А. Visual C++ и MFC. Программирование для Windows NT и Windows 95, 2-е издание, -СПб.: "БХВ-Петербург", 2002;

9. Нейдер, Д. OpenGL. Официальное руководство программиста, -СПб.: "ДиаСофтЮП", 2002;

10. Рэнди Дж. Рост. OpenGL. Трехмерная графика и язык программирования шейдеров, -М.: "Вильямс", 2000.

Приложение А

Графический материал

Рисунок А.1- Прототип модели нефтяной платформы

Рисунок А.2 - Главная форма приложения

Схема А.1 - Диаграмма классов приложения

Схема А.2 - Обобщенный алгоритм работы программы

ПРИЛОЖЕНИЕ Б

фрагменты КОДа ПРОГРАММЫ

// Функция рисования трехмерной сцены

void CLR1View::usr_RenderScene()

{

glClearColor(1.0f, 1.0f, 1.0f, 1);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef (0.0f, 0.0f, -7.0f);

glPushMatrix();

glRotatef(m_UgolX,1,0,0);

glRotatef(m_Angle,0,1,0);

glColor3f(0.0f, 0.0f, 1.0f);

//auxWireCube(4.0);

// Платформа

glColor4f (0.5, 0.5, 0.5, 0.0);

glPushMatrix ();

glScalef (8.0, 1.0, 8.0);

Cube(0.5);

glPopMatrix ();

// Бочки

glColor4f (1.0, 0.0, 0.0, 0.0);

glPushMatrix ();

glTranslatef (-2.0, -0.5, 1.0);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glPopMatrix ();

glPushMatrix ();

glTranslatef (2.0, -0.5, 1.0);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glTranslatef (0.0, 0.0, -0.3);

Cylinder(0.1, 0.7);

glPopMatrix ();

// Постройка

glColor4f (0.7, 0.5, 0.3, 0.0);

glPushMatrix ();

glTranslatef (-1.5, 0.45, 0.0);

glScalef (1.0, 1.0, 4.0);

Cube(0.5);

glPopMatrix ();

glPushMatrix ();

glTranslatef (-0.5, 0.75, 0.0);

glScalef (5.0, 1.0, 5.0);

Cube(0.5);

glPopMatrix ();

// Бур

glColor4f (0.0, 0.0, 1.0, 1.0);

glPushMatrix ();

glRotatef (m_AngleBur, 0.0, 1.0, 0.0);

glTranslatef (0.0, 1.0, 0.0);

Cylinder(0.25, 2.5);

Cylinder(0.2, 5.0);

glTranslatef (0.0, -2.0, 0.0);

Cube(0.5);

glTranslatef (0.0, -0.8, 0.0);

Cube(0.5);

glPopMatrix ();

glColor4f (0.5, 0.5, 0.5, 0.0);

// Опора 1

glPushMatrix ();

glTranslatef (-1.0, -1.25, -1.0);

glScalef (1.0, 2.0, 1.0);

Cube(1.0);

glPopMatrix ();

// Опора 2

glPushMatrix ();

glTranslatef (-1.0, -1.25, 1.0);

glScalef (1.0, 2.0, 1.0);

Cube(1.0);

glPopMatrix ();

// Опора 3

glPushMatrix ();

glTranslatef (1.0, -1.25, -1.0);

glScalef (1.0, 2.0, 1.0);

Cube(1.0);

glPopMatrix ();

glPopMatrix();

glFinish();

SwapBuffers(::wglGetCurrentDC());

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.