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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 02.07.2011
Размер файла 261,3 K

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

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

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

Содержание

Введение

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

1.1 Основные возможности

1.2 Работа с матрицами

1.3 Проекции

1.4 Освещение

1.5 Спецификация материалов

1.6 Создание эффекта тумана

2. Разработка приложения для построения динамического изображения трехмерной модели объекта «Луноход»

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

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

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

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

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

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

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

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

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

Заключение и выводы

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

Приложения

Введение

OpenGL является одним из самых популярных прикладных программных интерфейсов (API - Application Programming Interface) для разработки приложений в области двумерной и трехмерной графики.

Стандарт OpenGL (Open Graphics Library - открытая графическая библиотека) был разработан и утвержден в 1992 году ведущими фирмами в области разработки программного обеспечения как эффективный аппаратно-независимый интерфейс, пригодный для реализации на различных платформах. Основой стандарта стала библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc. [1]

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

На сегодняшний день графическая система OpenGL поддерживается большинством производителей аппаратных и программных платформ. Эта система доступна тем, кто работает в среде Windows, пользователям компьютеров Apple. Свободно распространяемые коды системы Mesa (пакет API на базе OpenGL) можно компилировать в большинстве операционных систем, в том числе в Linux.

Характерными особенностями OpenGL, которые обеспечили распространение и развитие этого графического стандарта, являются:

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

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

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

Наличие хорошего базового пакета для работы с трехмерными приложениями упрощает понимание студентами ключевых тем курса компьютерной графики - моделирование трехмерных объектов, закрашивание, текстурирование, анимацию и т.д. Широкие функциональные возможности OpenGL служат хорошим фундаментом для изложения теоретических и практических аспектов предмета. [1]

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

1.1 Основные возможности

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

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

Функции описания источников света служат для описания положения и параметров источников света, расположенных в трехмерной сцене.

Функции задания атрибутов. С помощью задания атрибутов программист определяет, как будут выглядеть на экране отображаемые объекты. Другими словами, если с помощью примитивов определяется, что появится на экране, то атрибуты определяют способ вывода на экран. В качестве атрибутов OpenGL позволяет задавать цвет, характеристики материала, текстуры, параметры освещения.

Функции визуализации позволяет задать положение наблюдателя в виртуальном пространстве, параметры объектива камеры. Зная эти параметры, система сможет не только правильно построить изображение, но и отсечь объекты, оказавшиеся вне поля зрения.[7]

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

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

1.2 Работа с матрицами

Для задания различных преобразований объектов сцены в OpenGL используются операции над матрицами, при этом различают три типа матриц: модельно-видовая, матрица проекций и матрица текстуры. Все они имеют размер 4x4. Видовая матрица определяет преобразования объекта в мировых координатах, такие как параллельный перенос, изменение масштаба и поворот. Матрица проекций определяет, как будут проецироваться трехмерные объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет наложение текстуры на объект.[9]

Умножение координат на матрицы происходит в момент вызова соответствующей команды OpenGL, определяющей координату (как правило, это команда glVertex*.

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

Для определения элементов матрицы текущего типа вызывается команда void glLoadMatrix [fd] (GLtype *m), где «m» указывает на массив из 16 элементов типа float или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй, третий и четвертый. Еще раз следует обратить внимание, в массиве «m» матрица записана по столбцам.

Команда void glLoadIdentity(void) заменяет текущую матрицу на единичную.[11]

1.3 Проекции

В OpenGL существуют стандартные команды для задания ортографической (параллельной) и перспективной проекций. Первый тип проекции может быть задан командами void glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) и void gluOrtho2D (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top).

Первая команда создает матрицу проекции в усеченный объем видимости (параллелепипед видимости) в левосторонней системе координат. Параметры команды задают точки (left, bottom, znear) и (right, top, zfar), которые отвечают левому нижнему и правому верхнему углам окна вывода. Параметры «near» и «far» задают расстояние до ближней и дальней плоскостей отсечения по удалению от точки (0,0,0) и могут быть отрицательными.

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

Перспективная проекция определяется командой void gluPerspective (GLdouble angley, GLdouble aspect, GLdouble znear, GLdouble zfar), которая задает усеченный конус видимости в левосторонней системе координат. Параметр «angley» определяет угол видимости в градусах по оси у и должен находиться в диапазоне от 0 до 180. Угол видимости вдоль оси x задается параметром «aspect», который обычно задается как отношение сторон области вывода (как правило, размеров окна). Параметры «zfar» и «znear» задают расстояние от наблюдателя до плоскостей отсечения по глубине и должны быть положительными. Чем больше отношение zfar/znear, тем хуже в буфере глубины будут различаться расположенные рядом поверхности, так как по умолчанию в него будет записываться «сжатая» глубина в диапазоне от 0 до 1.[10]

Прежде чем задавать матрицы проекций, нужно включить режим работы с нужной матрицей командой glMatrixMode(GL_PROJECTION) и сбросить текущую, вызвав glLoadIdentity().[5]

Рисунок 2. - Перспективная проекция

1.4 Освещение

В OpenGL используется модель освещения, в соответствии с которой цвет точки определяется несколькими факторами: свойствами материала и текстуры, величиной нормали в этой точке, а также положением источника света и наблюдателя. Для корректного расчета освещенности в точке надо использовать единичные нормали, однако команды: типа glScale*(), могут изменять длину нормалей. Чтобы это учитывать, нужно использовать режим нормализации векторов нормалей, который включается вызовом команды glEnable (GL_NORMALIZE).

Для задания глобальных параметров освещения используются команды void glLightModel [i, f] (GLenum pname, GLenum param) и void glLightModel [i f] v (GLenum pname, const GLtype *params). [4]

Аргумент «pname» определяет, какой параметр модели освещения будет настраиваться и может принимать следующие значения: GL_LIGHT_MODEL_LOCAL_VIEWER, параметр «param» должен быть булевым и задает положение наблюдателя. Если он равен GL_FALSE, то направление обзора считается параллельным оси z, вне зависимости от положения в видовых координатах. Если же он равен GL_TRUE, то наблюдатель находится в начале видовой системы координат. Это может улучшить качество освещения, но усложняет его расчет. Значение по умолчанию - GL_FALSE.

GL_LIGHT_MODEL_TWO_SIDE параметр «param» должен быть булевым и управляет режимом расчета освещенности, как для лицевых, так и для обратных граней. Если он равен GL_FALSE, то освещенность рассчитывается только для лицевых граней. Если же он равен GL_TRUE, расчет проводится и для обратных граней. Значение по умолчанию - GL_FALSE.

GL_LIGHT_MODEL_AMBIENT параметр «params» должен содержать четыре целых или вещественных числа, которые определяют цвет фонового освещения даже в случае отсутствия определенных источников света. Значение по умолчанию - (0.2, 0.2, 0.2,1.0).[8]

1.5 Спецификация материалов

Для задания параметров текущего материала используются команды void glMaterial [i f] (GLenum face, GLenum pname, GLtype param) void glMaterial [i f] v (GLenum face, GLenum pname, GLtype *params).

С их помощью можно определить рассеянный, диффузный и зеркальный цвета материала, а также степень зеркального отражения и интенсивность излучения света, если объект должен светиться. Какой именно параметр будет определяться значением «param», зависит от значения pname:

- GL_AMBIENT параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют рассеянный цвет материала (цвет материала в тени). Значение по умолчанию - (0.2, 0.2, 0.2, 1.0);

- GL_DIFFUSE параметр «params» должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют диффузный цвет материала. Значение по умолчанию - (0.8, 0.8, 0.8, 1.0);

- GL_SPECULAR параметр «params» должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют зеркальный цвет материала. Значение по умолчанию - (0.0, 0.0, 0.0, 1.0);

- GL_SHININESS параметр params должен содержать одно целое или вещественное значение в диапазоне от 0 до 128, которое определяет степень зеркального отражения материала. Значение по умолчанию - 0;

- GL_EMISSION параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют интенсивность излучаемого света материала. Значение по умолчанию: (0.0, 0.0, 0.0, 1.0);

- GL_AMBIENT_AND_DIFFUSE эквивалентно двум вызовам команды: glMaterial*() со значением «pname» GL_AMBIENT и GL_DIFFUSE и одинаковыми значениями «params».

Из этого следует, что вызов команды: glMaterial [i f] возможен только для установки степени зеркального отражения материала. Команда glMaterial[i f] v () используется для задания остальных параметров.

Параметр «face» определяет тип граней, для которых задается этот материал и может принимать значения GL_FRONT, GL_BACK или GL_FRONT_AND_BACK.

Если в сцене материалы объектов различаются лишь одним параметром, рекомендуется сначала установить нужный режим, вызвав glEnable() с параметром GL_COLOR_MATERIAL, а затем использовать команду void glColorMaterial (GLenum face, GLenum pname), где параметр «face» имеет аналогичный смысл, а параметр «pname» может принимать все перечисленные значения. После этого значения выбранного с помощью «pname» свойства материала для конкретного объекта (или вершины) устанавливаются вызовом команды glColor*(), что позволяет избежать вызовов более ресурсоемкой команды glMaterial*() и повышает эффективность программы.[3]

1.6 Создание эффекта тумана

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

Туман в OpenGL реализуется путем изменения цвета объектов в сцене в зависимости от их глубины, т.е. расстояния до точки наблюдения. Изменение цвета происходит либо для вершин примитивов, либо для каждого пикселя на этапе растеризации в зависимости от реализации OpenGL. Этим процессом можно частично управлять.[2] Для включения эффекта затуманивания необходимо вызвать команду glEnable (GL_FOG).

Метод вычисления интенсивности тумана в вершине можно определить с помощью команд void glFog [if] (enum pname, T param); void glFog [if] v (enum pname, T params);

Аргумент «pname» может принимать следующие значения:

GL_FOG_MODE аргумент «param» определяет формулу, по которой будет вычисляться интенсивность тумана в точке. В этом случае «param» может принимать значения:

- GL_EXP интенсивность вычисляется по формуле

f=exp(-d*z);

- GL_EXP2 интенсивность вычисляется по формуле

f=exp(-(d*z)2);

- GL_LINEAR интенсивность вычисляется по формуле

f=e-z/e-s,

где z - расстояние от вершины, в которой вычисляется интенсивность тумана, до точки наблюдения.

Коэффициенты d, e, s задаются с помощью следующих значений аргумента pname:

- GL_FOG_DENSITY param определяет коэффициент d;

- GL_FOG_START param определяет коэффициент s;

- GL_FOG_END param определяет коэффициент e.

Цвет тумана задается с помощью аргумента pname, равного GL_FOG_COLOR в этом случае params - указатель на массив из 4-х компонент цвета.[7]

2. Разработка приложения для построения динамического

изображения трехмерной модели объекта «Луноход»

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

За прорисовку паровоза отсвечает метод void CLr1View::OnDraw(CDC* pDC). Вся модель состоит из довольно большого числа примитивов, таких как цилиндр, конус, прямоугольник, сфера.

Первым рисуем сферу (в начале координат), после нее -цилиндр, затем этим фигуры совмещаем нужным образом, делаем это при помощи функции «glTranslated». За тем рисуем прямоугольник, который пододвигаем к концу цилиндра и развернуть на 90 градусов относительно оси х (glTranslated, glRotated). Дальше изображаем еще два одинаковых цилиндра, которые отличаются от первого только радиусом. Они также совмещены с остальными деталями объекта при помощи функций glTranslated, glRotated. За тем рисуем колеса паровоза которые соединяем с цилиндрами, сначала четыре правых за тем четыре левых, так же с помощью функций glTranslated, glRotated. После этого, в нужном месте (опять при помощи glTranslated, glRotated), изображаем конус, который поворачиваем относительно оси OX и перемещаем его в нужное нам место.

Все необходимые операции производились теми же функциями glTranslated, glRotated.

Вот собственно и вся модель. Весь код метода представлен в Приложении А, а алгоритм построения трехмерного объекта «Паровоз» средствами OPENGL, в Приложении В.

Так же в сцене присутствуют источник света. Можно включать/выключать эффект прозрачности, отражения и камеры, помимо этого можно менять направление движения паровоза. В прочем, теория описана в первой части проекта, а код - в приложении А.

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

Через интерфейс, пользователь может изменять работу программы. Имеются следующие возможности:

- настраивать проекции;

- включать/выключать источник света;

- включать/выключать эффект прозрачности;

- включать/выключать эффект отражения;

- включать/выключать камеры;

- разворачивать объект относительно дух осей;

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

- Right - повернуть объект вправо;

- Left - повернуть объект влево;

- Up - повернуть объект вверх;

- Down - повернуть объект вниз;

- Light0 - включить/выключить первый источник света;

- Blend - включить/выключить прозрачность объекта;

- Perspective - включение и настройка перспективной проекции;

- Smooth - включить сглаживание;

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

Таблица 1. - «Горячие» клавиши

Пункт меню

«Горячая» клавиша

вправо

влево

вверх

вниз

Включить освещение

L

Выключить освещение

K

Камера по оси X

W

Камера по оси X

S

Камера по оси Y

Q

Камера по оси Y

E

Камера по оси Z

A

Камера по оси Z

D

Движение вперёд/назад

N

Включение прозрачности

J

Выключение прозрачности

H

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

Любое windows-положение основано на событиях и их обработке, другими словами поведение программы управляется событиями. Данный проект тоже является windows приложением, и, следовательно, обработка событий занимает важное место. К основным событиям, играющим важную, для корректной работы программы, роль относятся следующие:

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

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

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

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

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

- ON_WM_CREATE()

- ON_WM_TIMER()

- ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

- ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

- ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

В обработчике события «WM_SIZE» выполняется код, необходимый для изменения сцены относительно размеров окна, в обработчике события «WM_DESTROY» освобождение занятых ресурсов. В обработчик «WM_ERASEBKGND» вставлен код для предотвращения мерцания. Остальные события служат для обработки событий выбор пунктов главного меню. Из описании приведенных выше хорошо видно что для чего служит (см. Приложение А).

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

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

Программа называется «Трехмерная модель Паровоз». При её использовании, пользователь получает возможность работать с визуальной моделью паровоза. Вращать её (модель) относительно двух осей, изменять освещение. Включать/выключать эффект прозрачности. Программное обеспечение, на котором разработана приложение - Microsoft Visual Studio6.0.

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

Данная программа предназначается для представления трехмерной модели паровоза. Приложение дает следующие возможности:

- наблюдать модель;

- изменять её положение в пространстве (вращать относительно двух осей);

- настраивать перспективу;

- выбирать тип проекции;

- включать/выключать эффект прозрачности;

- включать/выключать освещение;

- включать камеры по осям;

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

проекта

Во первых происходит инициализация OpenGL, она происходит в два этапа.

Первый этап. В методе «PreCreateWindow» устанавливается стиль окна, после чего - формат пикселей, это делается функцией usr_bSetupPixelFormat, в котором в свою очередь выполняются ChoosePixelFormat и SetPixelFormat, которые проверяют формат и устанавливают его соответственно.

Второй этап. Создается контекст воспроизведения, за это отвечает wglCreateContext, эта функция создает новый контекст воспроизведения OpenGL, который совместим с устройством, предоставленным дескриптором hdc. За этим устанавливается текущий контекст wglMakeCurrent (для удаления контекста есть функция wglDeleteContext. За инициализацию отвечает метод usr_bInitOpenGL.

При завершении работы программы нужно освободить занятые ресурсы, за это отвечает метод user_DestoryOpenGL.

Еще один важный метод (usr_ReSize) устанавливает область вывода, и перспективу. Он вызывается при каждом изменении размера окна.

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

Так как данная программа является так называемым windows-приложением, то алгоритм её работы зависит от конкретных событий, а пользователь, в свою очередь, получает возможность, через интерфейс, «порождать» эти события. Поэтому важную роль играют обработчики событий, таких как выбор пунктов меню, нажатие горячих клавиш (которые собственно синхронизированы между собой).

Самые важные для понимания логической структуры программы события описаны в разделе «2.3 Разработка подсистемы управления событиями». В итоге приведена таблица, в которой отображены основные методы (функции) и описано, за что они отвечают.

Таблица 2. - Основные методы и функции

Имя функции (метода)

Описание

PreCreateWindow

Инициализация окна

usr_bSetupPixelFormat

Установка формата пикселей

usr_bInitOpenGL

Инициализация OpenGL

user_DestoryOpenGL

Освобождение ресурсов (из-под OpenGL)

usr_ReSize

Корректирует вывод сцены на экран при изменении размера окна

usr_RenderScene

Рисует всю сцену (в частности вызывает методы рисования)

Axis

Вспомогательная функция, рисует оси координат

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

Для успешной эксплуатации программного продукта необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов - 256). Программное обеспечение: операционная система WINDOWS 2000/XP и выше.

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

Исходя из функционального назначения приложения видно, что пользователь получает следующие возможности:

- изменять положение модели в пространстве (вращать относительно двух осей);

- выбирать тип проекции;

- включать/выключать эффект прозрачности;

- включать/выключать освещение;

- включать камеры по осям;

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

Чтобы изменить положение паровоза в пространстве нужно выполнить одно из следующих действий:

- выбрать пункт меню «Operations» «Right», «Left», «Up Down» для поворота вправо, влево, вверх или вниз соответственно;

- нажить на одну из кнопок «>», «<»., «^», «v» для поворота в соответствующую сторону.

Чтобы включить/выключить эффект прозрачности нужно:

- выбрать пункт меню «Operations» > «BLEND »;

- нажать на клавишу «J», для включения прозрачности;

- нажать на клавишу «H, для выключения прозрачности».

Чтобы включить/выключить освещение нужно:

- выбрать пункт меню «Operations» > «Lighting» «Light0»;

- нажать на одну из клавиш «L» - для включения освещения и «K» - для выключения освещения.

Чтобы изменить направление движения паровоза нужно нажать на клавишу «N» или выбрать пункт меню «Operations» > «Rotate».

Открывается и закрывается приложение любым из привычных для ОС Windows способом (см. Приложение А).

Заключение и выводы

В результате проделанной работы, разработали приложение с использованием библиотеки OpenGL для построения динамического изображения трехмерной модели объекта «Луноход».

При использовании данной модели, пользователь получает возможность работать с визуальной моделью лунохода, т.е.:

- вращать модель относительно двух осей;

- включать/выключать освещение;

- включать/выключать эффект прозрачности;

- менять направление движения лунохода;

- настраивать камеру относительно оси Х;

- настраивать камеру относительно оси Y;

- настраивать камеру относительно оси Z.

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

1. Порев В.Н. Компьютерная графика. - СПб., BHV, 2002.

2. Шикин А.В., Боресков А.В. Компьютерная графика. Полигональные модели. - Москва, ДИАЛОГ-МИФИ, 2001.

3. Тихомиров Ю. Программирование трехмерной графики. - СПб, BHV, 1998.

4. Performance OpenGL: Platform Independent Techniques.

5. SIGGRAPH 2001 course.

6. OpenGL performance optimization, Siggraph'97 course.

7. Visual Introduction in OpenGL, SIGGRAPH'98.

8. The OpenGL graphics system: a specification (version 1.1).

9. Программирование GLUT: окна и анимация. Miguel Angel Sepulveda, LinuxFocus.

10. The OpenGL Utility Toolkit (GLUT) Programming Interface, API version 3, specification.

Приложение А

трехмерная графика луноход интерфейс

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

… usr_bSetupPixelFormat () - устанавливаем формат пикселей

… usr_bInitOpenGL () - инициализация OpenGL

… usr_DestroyOpenGL () - освобождение ресурсов (из-под OpenGL)

int CLr1View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

if (!this->usr_bInitOpenGL())

{

AfxMessageBox("ERROR!!!");

return -1;

}

return 0;

}

void CLr1View::OnDestroy()

{

CView::OnDestroy();

this->usr_DestroyOpenGL();

}

void CLr1View::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

usr_ReSize(0, 0, cx, cy);

}

void CLr1View::usr_ReSize(int x, int y, int width, int height)

{

if (height==0)height=100; // устранение возможной ошибки с инициализацией высоты окна

GLfloat stor=(GLfloat)(((GLfloat)width)/((GLfloat)height)); // считаем соотношение сторон (для масштабирования)

glViewport (0,0,(GLint)width,(GLint)height); // создаём область для вывода изображения

glMatrixMode(GL_PROJECTION); // устанавливаем тип матрицы для проекции

glLoadIdentity(); // загружаем единичную матрицу

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // режим работы с матрицами - перспектива.

glMatrixMode(GL_MODELVIEW); // режим матрицы - просмотр модели

}

BOOL CLr1View::OnEraseBkgnd(CDC* pDC)

{

return TRUE;

}

void CLr1View::usr_RenderScene()

{

glClearColor(0.5f, 0.4f, 0.9f, 1.0f); // установка фона

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); // очистка

glLoadIdentity(); // загрузка единичной матрицы

gluLookAt(x_e+2,y_e+0.8,z_e+8,0,0,0.1f*1-8,x_e+2,y_e+5.3,z_e+8-0.1f*1+8); // положение и направление камеры

glMaterialf(GL_FRONT,GL_SHININESS,10); // сила отражения 1 из 128

glRotatef(t_t*15, 0, 1,0);

//glTranslatef(0.0f,-2.2f,0.0f); // перемещаем "3D курсор"

glColor4f(0.5f,0.5f,0.6f,1.0f); // устанавливает цвет обьбекта

//glTranslatef(0.0f,2.2f,0.0f); // перемещаемся

glRotatef(y_rotate, 0, 1,0);

glRotatef(x_rotate, 1, 0,0);

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

auxSolidSphere(1.0); // рисуем сферу

glColor3f(0.1f, 0.1f, 1.1f);

gluSphere(q, 1.0f, 64, 32);

glTranslatef(0.0f,0.0f,0.0f);

glColor3f(0.1f, 0.7f, 1.1f);

gluCylinder(q, 1.0f,1.0f, 3.8f, 64, 32);

glTranslatef(0.0f,0.0f,3.8f);

gluCylinder(q, 1.0f,0.0f, 0.0f, 64, 32);

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

glColor3f(0.1f, 0.7f, 1.1f);

auxSolidBox(2.0f,2.5f,2.0f);

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

glTranslatef(0.0f,0.0f,0.8f);

glTranslatef(0.0f,0.0f,0.4f);

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

glTranslatef(0.5f,-1.0f,-5.0f);

glColor3f(0.5f, 0.5f, 0.5f);

gluCylinder(q, 0.2, 0.2f, 3.0f, 64, 32);

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

gluCylinder(q, 0.2, 0.2f, 3.0f, 64, 32);

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

glRotatef(90, 0, 1,0);

glTranslatef(0.0f,0.0f,0.0f);

// колеса

glColor3f(0.1f, 0.1f, 0.1f);

gluCylinder(q, 0.0f, 0.4f, 0.0f, 64, 32);

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

gluCylinder(q, 0.0f, 0.4f, 0.0f, 64, 32);

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

gluCylinder(q, 0.0f, 0.4f, 0.0f, 64, 32);

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

gluCylinder(q, 0.0f, 0.4f, 0.0f, 64, 32);

glTranslatef(0.0f,0.0f,1.6f);

gluCylinder(q, 0.4f, 0.0f, 0.0f, 64, 32);

glTranslatef(1.0f,0.0f,0.0f);

gluCylinder(q, 0.4f, 0.0f, 0.0f, 64, 32);

glTranslatef(1.0f,0.0f,0.0f);

gluCylinder(q, 0.4f, 0.0f, 0.0f, 64, 32);

glTranslatef(1.0f,0.0f,0.0f);

gluCylinder(q, 0.4f, 0.0f, 0.0f, 64, 32);

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

glRotatef(-90, 0, 1,0);

glTranslatef(0.5f,3.0f,0.2f);

glRotatef(90, 1, 0,0);

//труба

glColor3f(0.3f, 0.2f, 0.3f);

gluCylinder(q, 0.3f, 0.1f, 2.5f, 64, 32);

glRotatef(-90, 1, 0,0);

glRotatef(t_t*15, 1, 0,0); // поворот относительно оси оХ

glRotatef(y_rotate, 0, 1,0);

glRotatef(x_rotate, 1, 0,0);

glPopMatrix();

glFinish();

SwapBuffers(::wglGetCurrentDC());

}

void CLr1View::usr_PreInit()

{

// инициализация начальных положений и таймера

x_rotate=0;

y_rotate=0;

t_t=0;

t_n=0.22f;

x_e=0;

y_e=0;

z_e=0.7f;

////////////

float mat_spec[] ={0.2f,0.2f,0.3f}; // эффект отражения

float pos[3]={-0.8f,0.5f,0.0f}; // позиция источника света

float dir[3]={0.0f,0.0f,0.0f}; // направление света

glEnable (GL_DEPTH_TEST); // включение теста глубины (перекрытие объектов)

glEnable (GL_COLOR_MATERIAL); // разрешение цветных объектов

glMaterialfv(GL_FRONT,GL_SPECULAR,mat_spec); // эффект отражения

glMaterialf(GL_FRONT,GL_SHININESS,10); // эффект отражения

glEnable (GL_LIGHTING); // разрешение освещения

glEnable (GL_LIGHT0); // включение источника света

glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,dir); // направление света

glLightfv(GL_LIGHT0,GL_POSITION,pos); // позиция источника света

glShadeModel(GL_SMOOTH); // включение сглаживания

glMatrixMode(GL_MODELVIEW); // выбор вида матрицы

q = gluNewQuadric(); // Создать квадратичный объект

// тип генерируемых нормалей для него - «сглаженные»

gluQuadricNormals(q, GL_SMOOTH);

SetTimer(1, 50, NULL); // установка таймера для счётчика

}

void CLr1View::usr_DrawAxis()

{

glBegin(GL_LINES);

glColor3f(1,0,0);

glVertex3f(0,0,0);

glVertex3f(2,0,0);

glColor3f(0,1,0);

glVertex3f(0,0,0);

glVertex3f(0,2,0);

glColor3f(0,0,1);

glVertex3f(0,0,0);

glVertex3f(0,0,2);

glEnd();

}

void CLr1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch(nChar)

{

case VK_DOWN : x_rotate += 3;break; // вниз

case VK_UP : x_rotate -= 3;break; // вверх

case VK_LEFT : y_rotate += 3;break; // влево

case VK_RIGHT : y_rotate -= 3;break; // вправо

case 87 : x_e += 0.1f;break; // камера по х W

case 83 : x_e -= 0.1f;break; // камера по х S

case 81 : y_e += 0.1f;break; // камера по у Q

case 69 : y_e -= 0.1f;break; //камера по у E

case 65 : z_e += 0.1f;break; //камера по z A

case 68 : z_e -= 0.1f;break; //камера по z D

case 78 : t_n = -t_n;break; //движение вперёд/назад N

case 76 : glEnable (GL_LIGHTING);break; //вкл освещение L

case 75 : glDisable (GL_LIGHTING);break; //выкл освещение K

case 74 : glEnable(GL_BLEND);glDisable(GL_DEPTH_TEST); break; //вкл прозрачности J

case 72 : glDisable(GL_BLEND);glEnable(GL_DEPTH_TEST);break; //выкл прозрачности H

}

//Invalidate(); // не нужен, т.к. включен таймер

CView::OnKeyDown(nChar, nRepCnt, nFlags);

}

void CLr1View::OnTimer(UINT nIDEvent)

{

t_t+=t_n; // счётчик таймера

Invalidate(); // перепрорисовка

CView::OnTimer(nIDEvent);

}

Приложение Б

Диаграмма классов

Рисунок Б.1 - Диаграмма классов

Приложение В

Алгоритм построения трехмерного объекта «Паровоз» средствами OPENGL

Рисунок В.1 - Алгоритм построения объекта «луноход»

Приложение Г

Трехмерная модель объекта «Луноход»

Рисунок Г.1 - Трехмерная модель объекта «луноход»

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


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

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