это быстро и бесплатно
Оформите заказ сейчас и получите скидку 100 руб.!
ID (номер) заказа
3939701
Ознакомительный фрагмент работы:
Изучение трехмерной компьютерной графики на примере OpenGL
Задача трехмерной компьютерной графики
Трехмерная графика – это раздел компьютерной графики, основанный на
трехмерных моделях.
Задача трехмерной графики - презентовать объект, явление или
пространство в стилизованной или реалистичной визуальной форме. Дизайнеры
рисуют предметы почти с нуля, настраивают освещение, работают над
композицией кадра и в целом выполняют большую работу, поэтому часто
сложно понять, действительно ли мы видим фотографию или это качественный
3D-рисунок. То же самое касается анимации — эффектов в фильмах,
персонажей компьютерных игр, интерактивных презентаций.
OpenGL, что это?
OpenGL (Open Graphics Library — открытая графическая библиотека) —
спецификация, определяющая независимый от языка программирования кросс-
платформенный программный интерфейс для написания приложений,
использующих двумерную и трехмерную компьютерную графику (это стандарт
API).
Включает более 250-ти функций для рисования сложных трехмерных
сцен из простых примитивов. Используется при создании видео-игр, САПР,
виртуальной реальности, визуализации в научных исследованиях. На платформе
Windows конкурирует с DirectX.
OpenGL ориентируется на следующие две задачи:
скрыть сложности адаптации различных 3D-ускорителей предоставляя
разработчику единый API
скрыть различия в возможностях аппаратных платформ, требуя
реализации недостающей функциональности с помощью программной
эмуляции
История создания
Интерфейс OpenGL (Open Graphics Library) создан и запущен в 1992 году
известными компаниями в сфере разработки программ. Он был представлен как
кросс-платформенный интерфейс, не зависящий от аппаратного обеспечения. В
базе лежала IRIS GL - библиотека, которую ранее разработали специалисты из
Silicon Graphics Inc (SGI).
Но любая программа, а также библиотека не стоит на месте и постоянно
развивается, используя новые возможности компьютерной графики и
технологические особенности новых видеокарт.
Развитие библиотеки OpenGL происходит за счет специализированной
структуры - Architectural Review Board (ARB). Это "Комитет по пересмотру
архитектуры". В него включены несколько компаний, которые имеют
определенные интересы в процесс развития рассматриваемой библиотеки. Сюда
входят такие гиганты как 3D Labs, NVIDIA, ATI, Intel, id Software, SGI, Apple, и
Microsoft, который в своих реализациях Windows использует OpenGL. Версия
же этого OpenGL сходна с более ранними разработками и не может работать с
аппаратным ускорением, но эти возможности появляются благодаря драйверам
используемых видеокарт.
OpenGL используется повсюду, начиная с 90-х голов 20 века. Это связано
с тем, что данная библиотека была грамотно написана с удачной архитектурой.
Эта библиотека ведет себя стабильно при использовании, а также поведение
OpenGL легко предсказать. Одним из недостатков является медленное развитие.
Это связано с медленной работой ARB, а именно в том, что при изменении
определенных стандартов много времени уходит на согласование различных
документов.
Особенно это заметно в последнее время, когда дешевые видеокарты
стали достаточно профессиональными и их возможности меняются примерно
раз в год. А развитие OpenGL отстает от развития технологий видеокарт,
поэтому существуют расширения, использующие отдельными разработчиками
для возможности использования новых функций видеокарт.
Поддерживаемые операционные системы
OpenGL можно использовать в различных операционных системах, таких
как:
Windows,
Mac OS,
Linux,
BSD
и др.
Поддерживаемые языки
Официальный сайт OpenGL имеет ссылки на привязки для следующих
языков:
Java,
Фортран 90,
Perl,
Pike,
Python,
Ada,
Visual Basic,
Pascal.
Имеются также варианты привязки OpenGL для языков C++ и C#.
Система координат – куда направлены оси.
В OpenGL принята система координат, в которой ось Y направлена вверх,
ось Z вперёд, а X вправо.
OpenGL хранит матрицу преобразования в следующем виде:
Заметьте, что элементы в ней следуют в непривычном порядке - не строка
за строкой, а столбец за столбцом. Переход к записи, которая используется в
линейной алгебре, производится транспонированием.
Графические примитивы (точки, линии, полигоны, треугольники,
прямоугольник).
Создатели OpenGL планировали свой язык с явным намерением создать
"виртуальный графический акселератор", так чтобы примитивы OpenGL
максимально соответствовали примитивам современных графических карт и
требовали минимум кода для трансляции из одной системы команд в другую.
В OpenGL есть следующие типы примитивов:
точка,
линия,
треугольник,
прямоугольник,
полигон.
Каждый из этих объектов описывается перечислением своих вершин:
координаты точки, концов отрезка или вершин многоугольника.
Рисование примитивов
Процедура рисования заключается в командные скобки
glBegin(mode)
… // команды, указывающие вершины фигуры
glEnd;
Треугольник
Сейчас наше приложение рисует один треугольник. Если мы посмотрим
на класс OpenGLRenderer, то в методе prepareData увидим в нем список вершин:
Каждая пара значений – это координаты (x,y) одной вершины. Три пары = три
вершины = треугольник.
Далее, в методе onDrawFrame мы используем метод glDrawArrays чтобы
нарисовать треугольник.
GL_TRIANGLES - тип примитива, который необходимо нарисовать,
треугольник в нашем случае
0 - вершины надо брать из массива начиная с позиции 0, т.е. с самой
первой
3 - означает, что для рисования необходимо использовать три вершины
Типы треугольников
Чтобы нарисовать треугольник, мы передаем тип GL_TRIANGLES в
метод glDrawArrays. Существует еще два типа отрисовки треугольников:
GL_TRIANGLE_STRIP,
GL_TRIANGLE_FAN.
Линия
Переходим к линии. Чтобы нарисовать линию нам необходимо указать
две вершины.
Задаем их в массиве:
И перепишем onDrawFrame:
Используем константу GL_LINES и указываем, что надо использовать две
вершины.
Запускаем
Типы линий
Существует три типа отрисовки линий. Разберем их на примерах.
1. GL_LINES мы уже использовали, он просто берет попарно вершины и
рисует линии между ними. Т.е. если у нас есть вершины (v0, v1, v2, v3, v4, v5),
то мы получим три линии (v0,v1), (v2,v3) и (v4,v5).
2. Тип GL_LINE_STRIP рисует линии не попарно, а последовательно
между всеми вершинами. Т.е. если у нас есть вершины (v0, v1, v2, v3, v4, v5), то
мы получим пять линий (v0,v1), (v1,v2), (v2,v3), (v3,v4) и (v4,v5).
3. Тип GL_LINE_LOOP аналогичен GL_LINE_STRIP, только он вдобавок
еще рисует линию между первой и последней точкой.
Точка
Осталось рассмотреть точку. Здесь уже нет никаких разных типов, только
GL_POINTS.
Укажем его в glDrawArrays:
Нарисованы 6 точек:
Рисуем прямоугольник по 4 точкам
Полигон
Полигон позволяет описывать замкнутые поверхности из любого
количества точек.
GL_POLYGON - Рисование полигонов от 3 точек.
Текстура
Текстура — это 2D изображение (1D и 3D текстура также существуют),
используемое для добавления деталей объекту; считайте, что текстура — это
кусок бумаги с картинкой кирпича (к примеру), который наклеен на ваш дом и
кажется, что ваш дом сделан из кирпича.
Для того, чтобы привязать текстуру к треугольнику мы должны сообщить
каждой вершине треугольника, какой части текстуры принадлежит эта вершина.
Каждая вершина, соответственно должна иметь текстурные координаты,
ассоциированные с частью текстуры
Текстурные координаты находятся в промежутке между 0 и 1 по x и y оси
(мы же используем 2D текстуры). Получение цвета текстуры с помощью
текстурных координат называется отбором (sampling). Текстурные координаты
начинаются в (0, 0) в нижнем левом углу текстуры и заканчиваются на (1, 1) в
верхнем правом углу.
Мы указали 3 текстурные координаты для треугольника. Мы хотим, чтобы
нижний левый угол треугольника соотносился с нижним левым углом текстуры,
поэтому мы передаем (0, 0) нижней левой вершине треугольника.
Соответственно в нижнюю правую вершину передаем (1, 0). Верхняя вершина
треугольника должна соотноситься с центральной частью верхней стороной
текстуры, поэтому мы передаем в верхнюю вершину (0.5, 1.0) в качестве
текстурной координаты.
В результате текстурные координаты для треугольника должны выглядеть
следующим образом:
Триангуляция
Процесс разбиения полигональной области со сложной конфигурацией в
набор треугольников называется триангуляцией. При анализе или синтезе
сложных поверхностей их аппроксимируют сеткой треугольников, и
впоследствии оперируют с простейшими полигональными областями, т.е. с
каждым из треугольников.
Особый интерес к алгоритмам триангуляции определяется тем, что они
используются во многих процедурах машинной графики, таких как
формирование поверхностей, закраска, удаление невидимых частей, отсечение.
При триангуляции в качестве исходных данных наиболее часто задаются
вершины полигона. Задача состоит в том, чтобы представить этот полигон
совокупностью составных непересекающихся треугольников. В одном из самых
распространенных программных интерфейсов (API) для разработки
приложений в области двумерной и трехмерной графики стандарте OpenGL для
формирования триангуляционной сетки используются следующие команды:
GL_TRIANGLES. Треугольники. Команда рисует серию треугольников,
используя тройки вершин v0, v1 и v2, затем v3, v4 и v5 и т.д. Если количество
вершин не кратно 3, оставшиеся точки игнорируются. Команду удобно
использовать при описании поверхности, которая в результате тесселяции
представляется кроме треугольников и другими геометрическими фигурами,
например, прямоугольниками. В этом случае треугольники могут быть не
соприкасаться между собой. Команда может использоваться для описания всех
треугольников полигона, независимо от того, связаны они или нет между собой,
однако из-за дублирования информации о координатах общих вершин память
используется нерационально.
GL_TRIANGLE_STRIP. Полоса треугольников. Команда рисует серию
треугольников, используя вершины в следующем порядке: v0, v1, v2, затем v2,
v0, v3, затем v2, v3, v4, и т. д. При таком подходе каждая следующая вершина
вместе с двумя предыдущими задает треугольник. Порядок вершин должен
гарантировать, что треугольники имеют правильную ориентацию. Полоса
может использоваться для формирования части поверхности.
GL_TRIANGLE_FAN. Команда похожа на GL_TRIANGLE_STRIP, но при
формировании треугольников используют вершины в таком порядке: v0, v1, v2,
затем v0, v2, v3, затем v0, v3, v4, и т. д. Все треугольники имеют общую
вершину v0. Команда позволяет разбить n-угольник на n-2 треугольника. Для
этого нужно выбрать одну из n вершин полигона и соединить ее с каждой из n-3
несоседних вершин.
Матрицы
Однородные координаты
До текущего момента мы оперировали 3х-мерными вершинами как (x, y,
z) триплетами. Введем еще один параметр w и будем оперировать векторами
вида (x, y, z, w).
Нужно заомнить:
Если w == 1, то вектор (x, y, z, 1) - это позиция в пространстве.
Если же w == 0, то вектор (x, y, z, 0) - это направление.
Однородные координаты позволяют нам с помощью одной
математической формулы оперировать векторами в обоих случаях.
Матрицы трансформаций
в трехмерной графике мы будем использовать только матрицы 4x4,
которые позволят нам трансформировать наши вершины (x, y, z, w).
Трансформированная вершина является результатом умножения матрицы на
саму вершину:
Матрица x Вершина (именно в этом порядке!!) = Трансформир. вершина
Мы будем использовать это довольно часто, так что имеет смысл
поручить это компьютеру:
Аффинные преобразования
Аффинные преобразования координат (поворот, перемещение и
масштабирование) выполняются над объектом в МСК. Преобразования
выполняются в результате умножения координат точек, задающих вершины
объекта, на видовую матрицу, имеющую вид:
Иными словами, элементы видовой матрицы, как, впрочем, и любой иной
матрицы OpenGL, размещаются в памяти по столбцам - так, как это принято в
Фортране.
Видовую матрицу можно изменить. Однако прежде ее необходимо сделать
текущей. Это происходит после вызова
call fglMatrixMode(gl_modelview) ! Текущей стала видовая матрица
В свою очередь, видовая матрица может быть:
установлена равной матрице идентичности:
call fglLoadIdentity( )
установлена равной произвольной, ранее заданной матрице, например:
real(4), dimension(4, 4) :: matr
matr = reshape((/ 0.3, -0.5, 0.1, 0.0, &
0.2, -0.4, 0.2, 0.0, &
0.1, -0.3, 0.3, 0.0, &
0.0, 0.0, 0.0, 1.0 /), &
shape = (/ 4, 4 /))
call fglMatrixMode(gl_modelview) ! Текущей стала видовая матрица
call fglLoadMatrixf(loc(matr)) ! Матрица matr загружена как видовая
матрица
умножена на другую произвольную матрицу, например:
real(4), dimension(4, 4) :: rx, ry
sf = sqrt(1.0 / 3.0); cf = sqrt(2.0 / 3.0)
sp = sqrt(1.0 / 2.0); cp = sqrt(1.0 / 2.0)
rx = reshape((/ 1.0, 0.0, 0.0, 0.0, &
0.0, cf, -sf, 0.0, &
0.0, sf, cf, 0.0, &
0.0, 0.0, 0.0, 1.0 /), &
shape = (/ 4, 4 /))
ry = reshape((/ cp, 0.0, sp, 0.0, &
0.0, 1.0, 0.0, 0.0, &
-sp, 0.0, cp, 0.0, &
0.0, 0.0, 0.0, 1.0 /), &
shape = (/ 4, 4 /))
. . .
call fglMatrixMode(gl_modelview) ! Теперь видовая матрица является текущей
call fglMultMatrixf(loc(rx)) ! Умножаем текущую матрицу на матрицу rx
call fglMultMatrixf(loc(ry)) ! Умножаем текущую матрицу на матрицу ry
умножена на матрицу аффинного преобразования:
- матрицу вращения:
call fglRotatef(ay, 0.0, 1.0, 0.0) ! Поворот на угол ay против часовой стрелки
- матрицу масштабирования:
Например, умножение на матрицу
обеспечит вызов
call fglScalef(0.5, 0.5, 0.7) ! Масштабирование объекта
- матрицу переноса:
Например, умножение на матрицу
вызовет перенос объекта на 10 единиц вдоль оси x:
call fglTranslatef(10.0, -30.5, 20.7) ! Перенос объекта вдоль оси x
Direct X и OpenGL – сравнение с точки зрения доступных
поддерживаемых операционных систем.
Разработка приложений Direct3D ориентирована на платформу Microsoft
Windows.
API OpenGL является открытым стандартом, что означает, что различные
производители оборудования и разработчики операционных систем могут
свободно создавать реализацию OpenGL как часть своей системы. Реализации
OpenGL существуют для самых разных платформ. Наиболее примечательно, что
OpenGL является доминирующим графическим API Unix-подобных
компьютерных систем.
С точки зрения разработчика приложений Direct3D и OpenGL одинаково
открыты; полная документация и необходимые инструменты разработки
доступны без ограничений.
API Поддержка
десктопов
Поддержка
встраиваемых систем Лицензия
Direct3D Microsoft
Windows, Xbox
Windows
Embedded,Windows
CE (через Direct3D
Mobile)
Проприетарные
OpenGL Кроссплатформенность Кросс-платформенный
через OpenGL ES
Открытый
стандарт,
некоторые
запатентованные
функции
Более подробно, два API компьютерной графики являются следующими:
1. Direct3D-это проприетарный API от Microsoft, который предоставляет
функции для рендеринга двумерной (2D) и трехмерной (3D) графики и
использует аппаратное ускорение, если оно доступно на видеокарте. Он был
разработан корпорацией Microsoft для использования на платформе Windows.
2. OpenGL-это открытый стандартный API, который предоставляет
множество функций для рендеринга 2D и 3D графики и доступен в большинстве
современных операционных систем, включая, но не ограничиваясь ими,
Windows, macOS и Linux.
Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников
Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.
Цены ниже, чем в агентствах и у конкурентов
Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит
Бесплатные доработки и консультации
Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки
Гарантируем возврат
Если работа вас не устроит – мы вернем 100% суммы заказа
Техподдержка 7 дней в неделю
Наши менеджеры всегда на связи и оперативно решат любую проблему
Строгий отбор экспертов
К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»
Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован
Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн
Требуется разобрать ст. 135 Налогового кодекса по составу напогового...
Решение задач, Налоговое право
Срок сдачи к 5 дек.
Школьный кабинет химии и его роль в химико-образовательном процессе
Курсовая, Методика преподавания химии
Срок сдачи к 26 дек.
Реферат по теме «общественное мнение как объект манипулятивного воздействий. интерпретация общественного мнения по п. бурдьё»
Реферат, Социология
Срок сдачи к 9 дек.
Выполнить курсовую работу. Образовательные стандарты и программы. Е-01220
Курсовая, Английский язык
Срок сдачи к 10 дек.
Изложение темы: экзистенциализм. основные идеи с. кьеркегора.
Реферат, Философия
Срок сдачи к 12 дек.
Заполните форму и узнайте цену на индивидуальную работу!