Учебная работа. Лабораторная работа: Трехмерная графика OpenGL
3d графика OpenGL
1. Теоретическая часть
1.1 Подключение графической библиотеки OpenGL к интерфейсу Windows
Эталон реализации OpenGL для Windows просит выполнения неких опций, связанных с чертами операционной системы. Для того чтоб оконная система могла работать с OpenGL, нужно провести ее инициализацию и изменить буфер фрейма.
Система OpenGL, как и хоть какое другое приложение Windows, нуждается в ссылке на окно, на котором будет осуществляться проигрывание. ссылка на контекст проигрывания – величина типа HGLRC (Handle to OpenGL Rendering Context) – связывает OpenGL с оконными системами Windows.
Для получения этого контекста OpenGL нуждается в величине типа HDC (контекст устройства) окна, на который будет осуществляться вывод.
Таковым образом, чтоб начать работать с командами OpenGL, приложение обязано сделать один либо несколько контекстов проигрывания для потока, и создать текущим один из их. Любой поток при всем этом может иметь один и лишь один текущий контекст проигрывания, который ассоциирован с определённым контекстом устройства.
До этого чем получить контекст проигрывания, OpenGL должен получить детальные свойства применяемого оборудования. Эти свойства хранятся в специальной структуре, тип которой TPixelFormatDescriptor (описание формата пикселей). формат пикселей описывает число бит на пиксел, конфигурацию буфера цвета и вспомогательных буферов применяемых для вывода изображения.
Для установки формата пикселей нужно написать подобающую функцию, обычный пример которой приведён в приложении 2.
Для работы с контекстом проигрывания в Win32 API реализованы последующие функции.
wglCreateContext(dc);
Функция создаёт контекст проигрывания OpenGL, который подступает для рисования на устройстве, определённом дескриптором dc. При успешном окончании функция возвращает дескриптор сделанного контекста проигрывания OpenGL, и NULL – в случае беды.
Текущий контекст проигрывания потока должен быть единственным. Последующая функция дозволяет найти контекст проигрывания для контекста устройства.
wglMakeCurrent (dc, hrc);
При окончании работы, нужно, чтоб контекст никем не употреблялся. Для этого довольно выполнить вызов функции:
wglMakeCurrent (0,0);
Завершая работу с OpenGL нужно удалить контекст проигрывания. Для данной для нас цели употребляется функция:
wglDeleteContext(hrc);
Опосля того как удалён контекст проигрывания, следует удалить и ассоциированный с ним контекст устройства.
Структуру приложения, использующего OpenGL, можно изобразить в виде схемы (рис. 1)
1.2 Синтаксис установок
OpenGL
Для того чтоб команды OpenGL были доступны в проекте, нужно указать библиотеку в перечне применяемых модулей.
Все команды начинаются с префикса gl, потом идет имя команды, цифра и суффикс. Цифра в окончании соответствует количеству аргументов, буковка указывает требуемый тип аргумента.
Если имя команды завершается на v
(векторная форма), то аргументом её служит указатель на массив значений.
к примеру: Если крайние три знака в имени команды 3fv
, то её аргумент – адресок массива трёх вещественных чисел.
В общем виде команду можно представить:
glCommandName {1,2,3,4} {b, s, i, f, d, ub, us, ui} {v} (arguments)
Таблица 1.1. Вероятные типы аргументов
знак
Обозначение типа в OpenGL
Расшифровка
b
GLbyte
Байтовый
s
GLshort
Маленький целый
i
GLint
Целый
d
GLdouble
Вещественный двойной точности
f
GLfloat
Вещественный
ub
GLubyte
Байтовый, беззнаковый
us
GLushort
Маленький целый, беззнаковый
ui
GLuint
Целый, беззнаковый
Практически постоянно желательно применять команду в вещественной форме, так как хранит данные OpenGL конкретно в вещественном формате.
1.3 Рисование примитивов
Процедура рисования заключается в командные скобки
glBegin(mode)
… // команды, указывающие верхушки фигуры
glEnd;
основное предназначение командных скобок – это задание режима, определяющего как соединять точки (верхушки). Верхушки задаются своими координатами (количество координат зависит от места изображения) при помощи установок glVertex {2,3,4} {s, i, f, d} (arg).
Режим (
mode
)
, задающий правило соединения точек, описывает примитив. К примитивам относятся точки, полосы, связанные полосы, замкнутые полосы, треугольники, связанные треугольники, четырёхугольники, связанные четырёхугольники и многоугольники.
Пример: задание стороны куба
glBegin (GL_POLYGON);
glNormal3f (0.0, 0.0, 1.0);
glVertex3f (1.0, 1.0, 1.0);
glVertex3f (-1.0, 1.0, 1.0);
glVertex3f (-1.0, -1.0, 1.0);
glVertex3f (1.0, -1.0, 1.0);
glEnd;
Таблица 1.2.
mode
Описание
GL_POINTS
Любой вызов glVertex задает отдельную точку. Отрисовывают N точек
GL_LINES
Любая пара вершин задает отрезок. Отрисовывают N/2 линий
GL_LINE_STRIP
Рисуется ломанная. Элементы n и n+1 определяют отрезок n. рисуется N – 1 отрезков
GL_LINE_LOOP
Рисуется ломанная, при этом ее крайняя точка соединяется с первой. элементы n и n+1 определяют отрезок n. крайняя линия определяется элементом N и 1. рисуется N отрезков
GL_TRIANGLES
Любые три вызова glVertex задают треугольник. элементы 3n – 2, 3n‑1, и 3n определяют треугольник n. Рисуется N/3 треугольников.
GL_TRIANGLE_STRIP
Рисуются треугольники с общей стороной. Для нечетного n, элементы n, n+1, n+2 определяют треугольник n. Для нечетного n элементы n+1, n, n+2 определяют треугольник n. Рисуется N‑1 треугольников.
GL_TRIANGLE_FAN
Отрисовывают группу соединенных треугольников. один треугольник определяется для всякого элемента опосля 2-ух прошлых. Два крайних элемента соединяются с первым. рисуется N – 2 треугольников.
GL_QUADS
Любые четыре вызова glVertex задают четырехугольник. рисуется N/4 четырехугольника.
GL_QUAD_STRIP
Четырехугольники с общей стороной. соединяя чётные элементы с чётными, а нечётные с нечётными.
GL_POLYGON
Полигон. Элементы с 1 по N определяют этот полигон.
(при всем этом точки полигона сортируются так, чтоб грани у получившегося многоугольника не пересекались)
1.4 Визуализация сцены
Для сотворения сцены нужно задать область вывода объектов и задать метод проецирования.
Если область вывода не задана очевидно, то в OpenGL употребляется установленная по дефлоту зона в виде куба видимости 2x2x2 с началом координат в центре куба (рис. 2).
Рис. 2. Вид системы координат Oxyz
Система координат в OpenGL Oxyz (рис. 2) размещена таковым образом, что ось Oz ориентирована в сторону обратную направления зрения. Окно видимости (Windows) масштабируется в границах [-1; 1] по осям Ox, Oy. Изображение по дефлоту воспроизводится на плоскости z=0.
Существует два типа проецирования: параллельная
Рис. 3. Схема преобразования координат
1.5 Видовые преобразования
Видовые преобразования осуществляются при помощи матричных преобразований. В OpenGL текущая матрица преобразований является произведением 2-ух матриц – матрицы модели и матрицы проецирования, при всем этом формируется единая матрица преобразования, которая применяется ко всем верхушкам всех геометрических объектов.
Матрица модели
– glMatrixMode (GL_MODELVIEW) связана с координатами объектов. Это матрица в базисе видовых координат, она употребляется для построения рисунки в том виде как её лицезреет наблюдающий.
Матрица проецирования
– glMatrixMode (GL_PROJECTION). Матрица в системе координат устройства. Вычисляет нормализованные координаты, которые преобразуются в экранные опосля трансформаций, связанных с областью вывода.
Команда glLoadIdentity подменяет текущую матрицу единичной матрицей
(матрицей с единицами по главной диагонали и равными нулю всеми остальными элементами).
1.6 Аффинные преобразования
1.6.1 Масштабирование
Преобразование масштабирования наращивает либо уменьшает размеры объекта.
Команда масштабирования glScale (arg1, arg2, arg3) с 3-мя аргументами – коэффициентами масштабирования по каждой из осей.
Если масштабные множители больше единицы объект растягивается в данном направлении, если меньше объект сжимается. Масштабные множители могут иметь отрицательные значения, при всем этом изображение переворачивается по соответственной оси. При двумерных построениях
Опосля установок рисования следует вернуть обычный масштаб, чтоб каждое последующее воззвание к обработчику перерисовки экрана не приводило бы к поочередному уменьшению / повышению изображения.
1.6.2 Поворот
Для поворота изображения употребляется команда
glRotate (arg1, arg2, arg3, arg4)
с 4-мя аргументами:
arg1 – угол поворота (в градусах),
arg2, arg3, arg4 – вектор поворота.
1.6.3 Сдвиг
Преобразование сдвига сдвигает точки в новейшие позиции в согласовании с данным вектором смещения. Перенос системы координат осуществляется командой
glTranslate (arg1, arg2, arg3)
arg1, arg2, arg3 – величины переноса по каждой из осей.
Для поворота вокруг случайной фиксированной точки поначалу необходимо выполнить преобразование сдвига, совмещающую заданную фиксированную точку с началом координат, позже выполнить преобразование поворота вокруг начала координат, а потом оборотное преобразование сдвига. порядок манипуляции с системой координат: сначала перенос, потом поворот, по окончании рисования – в оборотном порядке: поворот, потом перенос.
1.7 Закрашивание объектов сцены
В трёхмерном пространстве поверхность объектов характеризуется материалом. Материал может отражать, всасывать и пропускать свет различной длины волн. Зависимо от черт материала и от параметров источника света мы лицезреем объекты разными. характеристики материала задаются при помощи команды glMaterialfv(). свойства параметров материала, определяют надлежащие им символьные константы, которые представлены в таблице 1.3.
Таблица 1.3. свойства параметров материала
GL_AMBIENT
растерянный свет
GL_DIFFUSE
Параметр, указывающий как очень этот цвет отражается поверхностью при её освещении
GL_EMISSION
излучаемый свет
GL_SHININESS
степень отраженного света
Зеркальный цвет задаёт цветовую палитру бликов материала, степень зеркального отражения описывает, как близка поверхность к безупречному зеркалу (определяется числом из интервала [0,128]).
характеристики материала задаются для наружной и внутренней стороны фигуры.
glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE,@MaterialFront);
glMaterialfv (GL_BACK, GL_AMBIENT_AND_DIFFUSE,@MaterialBack);
Существует несколько режимов рисования многоугольников.
Чтоб поменять способ отображения многоугольника употребляется команда:
glPolygonMode (GLenum face, Glenum mode)
Параметр mode описывает, как будут отображаться многоугольники, а параметр face устанавливает тип многоугольников, к которым будет применяться эта команда и могут принимать последующие значения:
Таблица 1.4. Значения характеристик face и mode
GLenum face
GL_FRONT
для лицевых граней
GL_BACK
для оборотных граней
GL_FRONT_AND_BACK
для всех граней
Glenum mode
GL_
Показываются верхушки многоугольников
GL_LINE
представляется набором отрезков
GL_FILL
закрашиваются текущим цветом с учетом освещения и этот режим установлен по дефлоту.
Пример:
GlPolygonMode (GL_FRONT, GL_
GlPolygonMode (GL_ BACK, GL_LINE);
GlPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
1.8 Источники света
Без источника света изображения не видно. По дефлоту освещение отключено. Что бы инициализировать источник, и включить обработчик расчёта действия источника на объекты довольно выполнить команды:
glEnable (gl_lighting);
glEnable (gl_light0);
Источник света по дефлоту размещается в пространстве с координатами (0,0,¥
), можно создавать источник света в хоть какой точке места изображений.
характеристики источника света задаются при помощи команды,
glLightfv (source, parameter, pointer_to_array).
1-ый параметр команды – идентификатор источника
2-ой аргумент – символическая константа, задающая атрибут
3-ий – ссылка на структуру, содержащую задаваемые значения для данного атрибута.
Таблица 1.5. Константы, задающие характеристики окружающей среды и позицию источника света
GL_Position
задаёт позицию источника света, источник света не {перемещается} за системой координат (x, y, z, cos J)
GL_AMBIENT
растерянный свет
GL_DIFFUSE
Параметр, указывающий как очень этот цвет отражается поверхностью при её освещении
GL_SPECULAR
отраженный свет
GL_EMISSION
излучаемый свет
GL_SHININESS
степень отраженного света
GL_AMBIENT_AND_DIFFUSE
задаёт поглощение цвета поверхностью в рассеивающей составляющей
GL_SPOT_direction
направление света (x, y, z)
GL_SPOT_Cutoff
задаёт наибольший угол излучения источника света [0,90] и 180.
Для того чтоб внутренняя сторона объекта была видна нужно включить освещенность для внутренней стороны многоугольника. Световая модель с освещением внутренней части многоугольника врубается либо выключается соответственной функцией
glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, 1).
2-ой аргумент 0 либо 1 (вкл. либо выкл.).
1.9 Наложение текстуры
Создание текстуры в памяти
Опосля того как образ подготовлен, можно создавать текстуру в памяти. Для этого в OpenGL предусмотрены две команды: одна для одномерного и 2-ая для двумерного вариантов вида (обе работают лишь в режиме RGBA).
glTexlmage1D (void glTexlmage2D (
GLenum target, GLenum target,
GLint level, GLint level,
GLint components, GLint components,
GLsizei width, GLsizei width,
GLint border, GLsizei height,
GLenum format, GLint border,
GLenum type, GLenum format,
const GLvoid* pixels) GLenum type,
const GLvoid* pixels)
При разработке текстуры можно найти несколько образов с разным разрешением. Если текстура имеет размер 2n
x2m
, то можно найти max {n, m} + 1 уменьшенных массивов. 1-ый имеет размер 2n
x2m
, 2-ой – 2n
-1
x2m
-1
, и т.д., пока крайний не будет иметь размер 1×1. Команды glTexImage
*
D
предоставляют возможность найти р = max {n, m} таковых массивов, в любом из которых хранится уменьшенный образ начального изображения. наличие таковых массивов дозволит OpenGL применять наименьший образ для наименьшего объекта, а больший для большего. Иными словами, чем меньше объект, тем меньше его деталей удается разглядеть.
характеристики текстуры
один элемент на дисплее может покрывать несколько частей массива вида, и, чтоб избежать заморочек, связанных с лестничным эффектом, нужно учесть все затрагивающие этот массив элементы.
Для этого определяются четыре точки в массиве вида, которые показываются в четыре угла элемента на дисплее. Эти точки соединяются, и появляется четырехугольник. значения попадающих в него частей взвешиваются с учетом толики всякого элемента, содержащейся в многоугольнике, и потом суммируются.
Для учета особенностей текстуры нужно настроить характеристики текстуры, что можно создать при помощи команды
glTexParameter
[i
, f, v
] (target, pname, param)
target
–
описывает, с какой текстурой предполагается работать, – одномерной либо двумерной
pname
–
описывает символическое имя параметра текстуры:
ра
r
ат
описывает рпа
me
1.10 Внедрение доп библиотек
Невзирая на то, что библиотека OpenGL предоставляет фактически все способности для моделирования и проигрывания трёхмерных сцен, некие из функций, которые требуются при работе с графикой, впрямую отсутствуют в обычной библиотеке OpenGL. к примеру, чтоб задать положение и направление камеры, с которой будет наблюдаться сцена, необходимо самому рассчитывать модельную матрицу, а это далековато не все могут. Потому для OpenGL есть так именуемые вспомогательные библиотеки.
библиотека GLU
Библиотека GLU уже стала эталоном и поставляется вкупе с главной библиотекой OpenGL. В состав данной для нас библиотеки вошли наиболее сложные функции, к примеру для того чтоб найти цилиндр либо диск будет нужно всего одна команда. Также в библиотеку вошли функции для работы со сплайнами, реализованы доп операции над матрицами и доп виды проекций.
библиотека GLUT
Это независящая от платформы библиотека. Она реализует не только лишь доп функции OpenGL, да и предоставляет функции для работы с окнами, клавиатурой и мышкой. Для того чтоб работать с OpenGL в определенной операционной системе, нужно провести некую подготовительную настройку и эта подготовительная настройка зависит от определенной операционной системы. С библиотекой GLUT всё намного упрощается, практически несколькими командами можно найти окно, в каком будет работать OpenGL, найти прерывание от клавиатуры либо мышки и всё это не будет зависеть от операционной системы.
Библиотека предоставляет функции, при помощи которых можно определять сложные правильные полиэдры: куб, сфера, тор, конус, тетраэдр и додекаэдр, и даже можно при помощи одной команды найти непростой объект, типа чайник. к примеру, для проигрывания куба довольно выполнить команду: glutSolidCube(N), где N‑задаёт величину стороны грани куба. Список вероятных функций приведен в приложении 3.
2. Практическая часть
2.1 Моделирование двумерных графических объектов и анимации с внедрением графического эталона OpenGL
Сделать двумерную сцену. Изобразить две синусоиды в декартовой системе координат, используя примитивы OpenGL. Задать вращение в плоскости экрана вокруг произвольно избранного центра таковым образом, чтоб различные синусоиды имели разные скорости вращения.
2.2 Моделирование трёхмерных графических объектов и источников света с внедрением OpenGL
Сделать трёхмерную сцену. Пользуясь графическими объектами библиотеки GLUT (шар, конус, куб, тор, чайник и т.д.), сделать в пространстве графические образы. Для частей, из которых собраны объекты, задать разные характеристики материала и разные режимы проигрывания полигонов (точками, линиями, сплошное наполнение).
Расположить в случайных точках места несколько источников света. Задать свойства источникам света: один источник должен быть точечный, один направленный (типа «прожектор»). цвет источников подбирается из эстетических суждений.
Задать движение любым объектам сцены. Движение лучше обрисовывать неким повторяющимся законом, чтоб перемещение объектов носило повторяющийся нрав и не добивалось перезапуска программки для демонстрации.
Библиографический перечень
1. Эйнджел Эдвард. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2 изд.: Пер. с англ. – М.: Издательский дом «Вильямс», 2001.–592 с.:ил.
2. Ву Мейсон, Нейдер Джеки, Девис Том, Шрайнер Дейв. OpenGL. Официальное управление программера: Пер. с англ. СПб: ООО «ДиаСофтЮП», 2002. – 592 с.
3. Тихомиров Ю. Программирование трёхмерной графики – СПб.:BHV – Санкт-Петербург, 1998. – 256 с., ил.
4. Краснов М. OpenGL. Графика в проектах Delphi.–СПб.:БХВ – Санкт-Петербург, 2000.–352 с.:ил.
5. Роджерс Д. Алгоритмические базы машинной графики: Пер. с англ. – М.: мир, 1989. – 512 с., ил
]]>