admin / 16.08.2018

Уроки 3D Max и OpenGL.

Программирование 3D графики

Содержание

Введение

С детства я очень люблю играть в видео игры и мне хотелось написать какую-нибудь собственную игру. Изучив основы программирования, программированием 3D графики я занялся на 2-ом курсе.

Я имею 2 года опыта работы с 3D графикой в компании Soft-Xpansion. В Soft-Xpansion я восновном моделирую шестерёнки, болты, подшипники, валы, тригера и т.д.

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

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

1. Разработка полигональной модели объекта

1.1 Составляющие элементы объекта

Полигональная модель в компьютерной графике — это образ объекта, составленный из множества многоугольников. Мы будем разрабатывать полигональную модель объекта «самолёт». Трехмерное изображение объекта представлено на рис. 1.1.

Рисунок 1.1 – Трехмерное изображение проектируемого объекта

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

  • капсула;
  • параллелепипед;
  • призма, в основании которой прямоугольный треугольник.

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

1.2 Триангуляция поверхности объекта

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

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

Над объектом производится триангуляция следующим образом. Все примитивы, из которых состоит объект разбиты на треугольники. Все прямоугольные грани разбиваются диагональю на два равных треугольника. Таким образом, параллелепипеды состоят из 12 треугольных полигонов. Боковая поверхность цилиндра (часть нашей капсулы) разбита на части по высоте и каждая часть разбивается на равные прямоугольники, которые после разбиваются на треугольники.

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

Рисунок 1.2 – Формулы перехода из цилиндрической в декартову систему координат

Рисунок 1.3 – Параметрическое представление окружности

Призма, в основании которой прямоугольный прямоугольник состоит из 2 треугольников и 3 прямоугольников, которые легко разбиваются на полигоны.

На рисунке 1.4 представлено каркасное изображение объекта.

Рисунок 1.4 – Каркасное изображение проектируемого объекта

2. Описание алгоритмов аффинных преобразований

Любое изображение, выводимое на экран монитора, состоит из точек. Каждая точка в трехмерном пространстве, в свою очередь содержит три координаты – X (абсцисса), Y (ордината), Z (аппликата). Координаты точки однозначно определяют ее положение в системе координат. Мы будем использовать правую декартовую прямоугольную систему координат, общий вид которой показан на рисунке 2.1.

Рисунок 2.1 – Правая декартовая прямоугольная система координат

Здесь буквами x, y, z обозначены положительные направления осей Ox, Oy и Oz соответственно. Для вывода сцены на экран используются 3 системы координат:

  • СК сцены;
  • экранная СК;
  • СК камеры.

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

После выполнения геометрических преобразований, координаты (x, y, z) точки переходят в новые координаты (x*, y*, z*). Общие формулы преобразования координат показаны на рисунке 2.2. Но более удобной является матричная форма записи трехмерного преобразования (рис. 2.3). Здесь к координатам (x ,y, z) точки добавилась четвертая координата, равная единице и необходимая для выполнения преобразований в матричной форме. Такие координаты называются однородными.

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

Рисунок 2.3 – Матричная форма записи трехмерного преобразования

2.1 Перемещение объекта

Одним из простейших и часто применяемых аффинных преобразований является перемещение (сдвиг, перенос). Матрица A перемещения на вектор показана на рисунке 2.4. Алгоритм представлен на рисунке 2.5.

Рисунок 2.4 – Матрица перемещения

Рисунок 2.5 – Алгоритм переноса объекта

2.2 Вращение объекта

Аффинным преобразованием, которое позволяет смотреть на объект под разными углами и с разных сторон, является поворот объекта относительно координатных осей. Матрицы поворотов вокруг координатных осей показаны на рисунках 2.6, 2.7, 2.8 и вокруг произвольной оси на рисунке 2.9.

Рисунок 2.6 – Матрица поворота вокруг оси OX

Рисунок 2.7 – Матрица поворота вокруг оси OY

Рисунок 2.8 – Матрица поворота вокруг оси OZ

Рисунок 2.9 – Матрица поворота вокруг произвольной оси

Алгоритм поворота вокруг произвольной оси представлен на рисунке 2.10.

Рисунок 2.10 – Алгоритм поворота вокруг произвольной оси

2.3 Масштабирование объекта

Другим важнейшим аффинным преобразованием является масштабирование. Масштабирование — изменение размера изображения с сохранением пропорций. Под масштабированием подразумевается как увеличение изображения, так и его уменьшение. Матрица масштабирования представлена на рисунке 2.11, а алгоритм масштабирования на рисунке 2.12.

Рисунок 2.11 – Матрица масштабирования

Рисунок 2.12 – Алгоритм масштабирования

3. Описание алгоритмов проекционных преобразований

Проецирование — это процесс полу¬чения изображения предмета на какой-либо поверх¬ности, получившиеся при этом изображение, называют проекцией предмета.

Элементами, с помощью которых осуществляется проецирование, являются (рис. 3.1):

  • центр проецирования — точка, из которой производится проецирование;
  • объект проецирования — изображаемый предмет;
  • плоскость проекции — плоскость, на которую производится проецирование;
  • проецирующие лучи — воображаемые прямые, с помощью которых производится проецирование.

Рисунок 3.1 – Центральное проецирование [2]

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

При параллельном проецировании все проецирующие лучи параллельны между собой. На рисунке 3.2 показано, как получается параллельная прямоугольная проекция. Центр проецирования предполагается условно удалённым в бесконечность. Тогда параллельные лучи отбросят на плоскость проекций тень, которую можно принять за параллельную проекцию изображаемого предмета.

Рисунок 3.2 – Параллельное прямоугольное проецирование [2]

В проекте реализовано переключение между центральным и параллельным проецированием. Отличия при реализации системы проецирования появляются при вычислении координат проекций на аксонометрическую плоскость проекций камеры. Эта плоскость имеет размеры (–1,+1) по ширине и (–1/ar,+1/ar) по высоте, где ar – форматное отношение. Если при центральном проецировании имеет место формула, показанная на рисунке 3.3, то для параллельного проецирования справедлива формула, представленная на рисунке 3.4.

Рисунок 3.3 – Формула вычисления координат проекций при центральном проецировании

Рисунок 3.4 – Формула вычисления координат проекций при параллельном проецировании

В этой формуле a — половина ширины окна вывода, а b — половина его высоты.

4. Описание алгоритмов произвольных преобразований камеры

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

Камера задается следующими параметрами:

  • углом обзора;
  • фокусным расстоянием (от точки нахождения камеры до плоскости, на которую мы проецируем);
  • ближними и дальними плоскостями, которые участвуют в отсечении по пирамиде видимости.

Для камеры были реализованы: поворот, смещение и панорамирование.

Камера расположена в определенной точке пространства, а также имеет целевую точку. На основании этих двух точек рассчитываются три вектора: вверх, вправо и вперед, которые однозначно определяют направление камеры и образуют оси системы координат камеры (рисунок 4.1).

Рисунок 4.1 – Камера [4]

Получаем из МСК координаты точек объекта в координатной системе камеры. Схема представлена на рисунке 4.2.

Рисунок 4.2 – Получение координат точек объекта в СК камеры [4]

Основные функции для работы с камерой представленны на рисунках 4.3, 4.4, 4.5.

Рисунок 4.3 – Функция нахождения матрицы вида

Рисунок 4.4 – Функции вращения вокруг точки цели

Рисунок 4.5 – Функции вращения камеры вокруг своих осей

Для того чтобы получить координаты точки, представленной в мировых координатах, в координатах камеры необходимо эту точку умножить на матрицу камеры трансформации из МСК. Точку следует представить в однородных координатах. Матрица трансформации камеры приведена на рисунке 4.6. В этой матрице U – вектор «вправо», V – вектор «вверх», N – вектор «вперед», camPos – позиция камеры в МСК.

Рисунок 4.6 – Матрица камеры трансформации из МСК в СК камеры

После получения координат объекта в системе координат камеры получаем аксонометрическую проекцию объекта на плоскости проекций камеры. На рисунке 4.7 приведена упрощенная двумерная проекция плоскости обзора на плоскость xz. Примем угол обзора FOV равным 90 градусов, а расстояние от камеры до плоскости проекций d равным 1.

Рисунок 4.7 – Упрощенная двумерная проекция плоскости обзора на плоскость xz [4]

На рисунке 4.8 показан пример построения аксонометрического преобразования.

Рисунок 4.8 – Пример построения аксонометрического преобразования [4]

Перед нахождением перспективной проекции, нужно отсечь полигоны по пирамиде видимости (рис. 4.9).

Рисунок 4.9 – Пирамида видимости камеры [4]

Алгоритм перспективного проецирования объекта и отсечение по пирамиде видимости представлен на рисунке 4.10.

Рисунок 4.10 – Алгоритм перспективного проецирования

5. Программная реализация

Пример ввода параметров объекта представлен на рисунке 5.1

Рисунок 5.1 – Ввод параметров объекта

Примеры работы программы представленны на рисунках 5.2, 5.3, 5.4, 5.5.

Рисунок 5.2 – Работа программы, пример 1

Рисунок 5.3 – Работа программы, пример 2

Рисунок 5.4 – Работа программы, пример 3

Рисунок 5.5 – Работа программы, пример 4

Выводы

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

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

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

Полезные ресурсы

  1. Роджерс Д. «Алгоритмические основы машинной графики»: Пер. с англ.-М.:Мир, 1989.-512с.
  2. Рождерс Д., Адамс Дж. «Математические основы машинной графики»: Пер. с англ.- М.: Мир, 2001.-604с.
  3. Вангер Ф.С. «Справочник по трехмерному моделированию», СПб, 2002г.
  4. Ламот Андре. Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации.: Пер. с англ.–М.: Издательский дом «Вильяме», 2004.-1424с.: ил.- Парал. тит. англ.
  5. Френк Д. Луна «Введение в программирование трехмерных игр с DirectX 9.0», Wordware Publishing, 2003.
  6. Alan Watt «3D Computer Graphics» 3-е изд. Addison-Wesley, 2000
  7. Форум для разработчиков игр и программистов 3D графики [Электронный ресурс]: – Режим доступа: http://www.gamedev.ru

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

Сложно представить, что мог бы существовать условно бесплатный движок, на котором реально создать компьютерную игру. Однако, этот движок существует. Он трёхмерный, обладает нормальным IDE, встроенной физикой, аудио-движком и прописанными возможностями сетевого мультиплейера. Движок Unity поддерживает Windows, IOS, Android, операционные системы приставок Playstation, Xbox и Nintendo Wii.
Сложно представить, что Unity обладает возможностями, которые позволяют собрать блок команд в специальную версию для плагина, который встраивается в браузер. Таким образом, Вы сможете получить в окне браузера 3D картинку без занижения разрешения текстур и качества моделей.

Вообще, есть упоминания о технологиях, которые ставили своей целью работу с 3D в сети Интернет, в частности ActiveWords и VRML. Но все эти системы вытеснил Flash (в дополнении с Java и Silverlight). Прочие технологии существуют, но в данный момент, существенно угнетены технологией Flash.

Релиз третьей версии Unity на самом деле заставил обратить на этот движок внимание даже гигантов, разрабатывающих игры исключительно во Flash. Так что же всё-таки составляет суть и принципы движка Unity?
Unity – полноценный игровой движок, который направлен на то, что весь процесс разработки игры (за исключением скриптинга и подготовки игровых ресурсов) будет проводиться в отдельном редакторе.

Рассмотрим этот движок в сравнении с UnrealEngine3.

Достоинства Unity:

  • IDE: сочетание редактора сцен (в комплексе общего редактора) с редактором игровых объектов и редакторов скриптов. Дополнительно прилагаются генераторы деревьев и террейнов.
  • Улучшенные возможности скриптинга, а именно в отличие от вышеуказанного движка, в Unity доступны три языка: JavaScript, C# и разновидность Python’s Boo.
  • Кроссплатформенность – как уже упоминалось выше, поддерживаются Windows, MacOS, Wii, iPhone, iPod, iPad, Android, PS3 и XBox 360, не все из которых, конечно, доступны в бесплатной лицензии. Ну и веб-плагин, конечно, забывать не стоит.
  • Современный уровень графики, способный конкурировать с иными движками. Unity, безусловно, проигрывает UnrealEngine по количеству реализованных возможностей. Однако Unity обладает такими возможностями, как deferred освещение, стандартный набор постпроцессинговых эффектов, SSAO, ускоренная проработка лайтмапов.
  • Достойным образом проработанный физический движок.
  • Масштабируемость и производительность. Большую часть простых процессов движок обрабатывает на превосходном уровне.
  • Запуск любого приложения на Unity в веб-плагине.
  • Невысокая цена за полную лицензионную версию для крупного веб-разработчика.

Недостатки Unity:

  • Закрытость кода.

    Невозможность получения исходных кодов движка даже по лицензии.

  • Невозможность дополнения физики движка сторонними возможностями. Вы не сможете добавить в движок стороннюю физику, либо SpeedTree.

Реальные минусы сложно определить с первого взгляда. Движок производителен, стабилен и лёгок в применении.

У большинства малочисленных команд разработчиков компьютерных игр основной проблемой часто становился именно движок. Достаточно сложно писать с нуля единственному программисту в команде. Нужен полноценный бесплатный движок, и нужен он сразу, программист начинает искать бесплатные решении (Ogre, Irrlicht). Эти движки не так уж и плохи (Torchlight написан на Ogre), но они сложны в освоении и требуют не одного программиста, а целой команды. Конечно, можно обратиться к наборам типа GameMaker, но серьёзную игру с его помощью собрать сложно.

Что касается Unity, то в его случае имеется уже завершённый пайплайн, готовый рендерер, собранные физику, аудио и сетевое взаимодействие, мультиязычность.
Внешний вид:

Собственно IDE:

Можно прямо в IDE путём нажатия кнопки Play протестировать текущую сцену.


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


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


Разработчики проекта ААА-класса скорее всего напишут свой движок или купят что-то наподобие UnrealEngine3. Но если количество программистов невелико, то написание собственного движка может оказаться черезчур затратным. Скорость и сложность разработки браузерной казуальной игры на Unity значительно выше, чем на Flash, а графическое превосходство – очевидно.

Также на движке Unity вполне можно писать сайты, презентации, визуализировать научные проекты.

Стоит дать Unity шанс – этот движок подкупает неискушённого пользователя своим удобством, гибкостью, возможностями и скоростью разработки.

Также читайте:Хотите заняться разработкой игр: с чего начать?Буквально на днях на Гамине состоится анонс пятнадцатого конкурса по разработке игр.NextCastle Party — фестиваль инди и ретро игрОтечественная команда анонсирует игру с необычным названием «RIP»

Antananarivo

.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*