Программирование 3D графики
Содержание
- Введение
- 1. Разработка полигональной модели объекта
- 1.1 Составляющие элементы объекта
- 1.2 Триангуляция поверхности объекта
- 2. Описание алгоритмов аффинных преобразований
- 2.1 Перемещение объекта
- 2.2 Вращение объекта
- 2.3 Масштабирование объекта
- 3. Описание алгоритмов проекционных преобразований
- 4. Описание алгоритмов произвольных преобразований камеры
- 5. Программная реализация
- Выводы
- Полезные ресурсы
Введение
С детства я очень люблю играть в видео игры и мне хотелось написать какую-нибудь собственную игру. Изучив основы программирования, программированием 3D графики я занялся на 2-ом курсе. Я имею 2 года опыта работы с 3D графикой в компании Soft-Xpansion. В Soft-Xpansion я восновном моделирую шестерёнки, болты, подшипники, валы, тригера и т.д.
В мире освещены различные аспекты разработки трёхмерных приложений, однако основное внимание уделяется вопросам программирования — в частности, представления трехмерных объектов, их визуализации с учетом свойств материала объектов, освещения, перспективы, а также таким специфическим вопросам трехмерной визуализации, как создание различных визуальных спецэффектов и т.п. Рассмотрим такие задачи: визуализация трехмерного объекта, создание и параметризация объекта, алгоритмы центрального и параллельного проецирования, алгоритмы различных преобразований.
Программирование 3D графики рассмотрим на примере разработки графического редактора для работы с параметризированными трехмерными объектами. Существует множество прикладных программ, для работы с трехмерными графическими объектами. Всевозможные графические редакторы позволяют работать с объектами разного типа. При этом важными факторами являются точное отображение реальных объектов и скорость работы. В результате возникает задача графического моделирования объектов на ЭВМ, при решении которой главным фактором является наиболее точное отображение реального объекта.
1. Разработка полигональной модели объекта
1.1 Составляющие элементы объекта
Полигональная модель в компьютерной графике — это образ объекта, составленный из множества многоугольников. Мы будем разрабатывать полигональную модель объекта «самолёт». Трехмерное изображение объекта представлено на рис. 1.1.
Объект состоит из нескольких видов поверхностей, которые в свою очередь разбиваются на полигоны для удобства хранения и обработки. Объект состоит из следующих видов фигур:
- капсула;
- параллелепипед;
- призма, в основании которой прямоугольный треугольник.
Капсула задаётся базовой точкой, радиусом, высотой цилиндрической части капсулы. Параллелепипед задаётся базовой точкой, шириной, длиной и высотой, на основе которых происходит расчет координат восьми точек вершин параллелепипеда. Призма задаётся базовой точкой, 2-мя катетами треугольника, который лежит в основании призмы, и высотой призмы.
1.2 Триангуляция поверхности объекта
Триангуляция поверхностей – это процесс разбиения сложных объектов на треугольные полигоны. Триангуляция удобна при программировании графики, т.к.:
- треугольник является простейшим полигоном, вершины которого однозначно задают грань;
- любую область можно гарантированно разбить на треугольники;
- вычислительная сложность алгоритмов разбиения на треугольники существенно меньше, чем при использовании других полигонов;
- реализация процедур визуализации более проста для области, ограниченной треугольником;
- для треугольника легко определить три его ближайших соседа, имеющих с ним общие грани.
Над объектом производится триангуляция следующим образом. Все примитивы, из которых состоит объект разбиты на треугольники. Все прямоугольные грани разбиваются диагональю на два равных треугольника. Таким образом, параллелепипеды состоят из 12 треугольных полигонов. Боковая поверхность цилиндра (часть нашей капсулы) разбита на части по высоте и каждая часть разбивается на равные прямоугольники, которые после разбиваются на треугольники.
Для получения координат вершин капсулы используются формулы перехода из цилиндрической системы координат в декартову систему координат (рис. 1.2). В формулах цилиндр имеет радиус R и высоту ZC. Полной окружности соответствует диапазон изменения параметра угла от 0 до 2Пи. Если рассматривать некоторое фиксированное число, равномерно распределенных, точек по окружности, то приращение параметра между точками можно считать константой (рис. 1.3). На концах капсулы находятся полусферы, которые получаются путём разбиения конуса на части по высоте и вдоль основания, после этого нормализуем координаты всех вершин так что бы они лежали на нашей сфере и полученные прямоугольники разбиваем на полигоны.
Призма, в основании которой прямоугольный прямоугольник состоит из 2 треугольников и 3 прямоугольников, которые легко разбиваются на полигоны.
На рисунке 1.4 представлено каркасное изображение объекта.
2. Описание алгоритмов аффинных преобразований
Любое изображение, выводимое на экран монитора, состоит из точек. Каждая точка в трехмерном пространстве, в свою очередь содержит три координаты – X (абсцисса), Y (ордината), Z (аппликата). Координаты точки однозначно определяют ее положение в системе координат. Мы будем использовать правую декартовую прямоугольную систему координат, общий вид которой показан на рисунке 2.1.
Здесь буквами x, y, z обозначены положительные направления осей Ox, Oy и Oz соответственно. Для вывода сцены на экран используются 3 системы координат:
- СК сцены;
- экранная СК;
- СК камеры.
Начальной СК является СК сцены (либо камеры, при переходе в вид из камеры), конечной – экранная СК. Для перехода из одной системы координат в другую используются формулы поворота, смещения и масштабирования.
После выполнения геометрических преобразований, координаты (x, y, z) точки переходят в новые координаты (x*, y*, z*). Общие формулы преобразования координат показаны на рисунке 2.2. Но более удобной является матричная форма записи трехмерного преобразования (рис. 2.3). Здесь к координатам (x ,y, z) точки добавилась четвертая координата, равная единице и необходимая для выполнения преобразований в матричной форме. Такие координаты называются однородными.
2.1 Перемещение объекта
Одним из простейших и часто применяемых аффинных преобразований является перемещение (сдвиг, перенос). Матрица A перемещения на вектор показана на рисунке 2.4. Алгоритм представлен на рисунке 2.5.
2.2 Вращение объекта
Аффинным преобразованием, которое позволяет смотреть на объект под разными углами и с разных сторон, является поворот объекта относительно координатных осей. Матрицы поворотов вокруг координатных осей показаны на рисунках 2.6, 2.7, 2.8 и вокруг произвольной оси на рисунке 2.9.
Алгоритм поворота вокруг произвольной оси представлен на рисунке 2.10.
2.3 Масштабирование объекта
Другим важнейшим аффинным преобразованием является масштабирование. Масштабирование — изменение размера изображения с сохранением пропорций. Под масштабированием подразумевается как увеличение изображения, так и его уменьшение. Матрица масштабирования представлена на рисунке 2.11, а алгоритм масштабирования на рисунке 2.12.
3. Описание алгоритмов проекционных преобразований
Проецирование - это процесс полу¬чения изображения предмета на какой-либо поверх¬ности, получившиеся при этом изображение, называют проекцией предмета.
Элементами, с помощью которых осуществляется проецирование, являются (рис. 3.1):
- центр проецирования - точка, из которой производится проецирование;
- объект проецирования - изображаемый предмет;
- плоскость проекции - плоскость, на которую производится проецирование;
- проецирующие лучи - воображаемые прямые, с помощью которых производится проецирование.
Результатом проецирования является изображение или проекция объекта. Различают центральное и параллельное проецирование. При центральном проецировании все проецирующие лучи исходят из одной точки - центра проецирования, находящегося на определённом расстоянии от плоскости проекций (рисунок 3.1). При параллельном проецировании все проецирующие лучи параллельны между собой. На рисунке 3.2 показано, как получается параллельная прямоугольная проекция. Центр проецирования предполагается условно удалённым в бесконечность. Тогда параллельные лучи отбросят на плоскость проекций тень, которую можно принять за параллельную проекцию изображаемого предмета.
В проекте реализовано переключение между центральным и параллельным проецированием. Отличия при реализации системы проецирования появляются при вычислении координат проекций на аксонометрическую плоскость проекций камеры. Эта плоскость имеет размеры (–1,+1) по ширине и (–1/ar,+1/ar) по высоте, где ar – форматное отношение. Если при центральном проецировании имеет место формула, показанная на рисунке 3.3, то для параллельного проецирования справедлива формула, представленная на рисунке 3.4.
В этой формуле a - половина ширины окна вывода, а b - половина его высоты.
4. Описание алгоритмов произвольных преобразований камеры
Для построения изображения на экранной плоскости используется модель представления при помощи камеры. Она отвечает за предоставление пользователю мощнейшего механизма движения среди объектов сцены.
Камера задается следующими параметрами:
- углом обзора;
- фокусным расстоянием (от точки нахождения камеры до плоскости, на которую мы проецируем);
- ближними и дальними плоскостями, которые участвуют в отсечении по пирамиде видимости.
Для камеры были реализованы: поворот, смещение и панорамирование.
Камера расположена в определенной точке пространства, а также имеет целевую точку. На основании этих двух точек рассчитываются три вектора: вверх, вправо и вперед, которые однозначно определяют направление камеры и образуют оси системы координат камеры (рисунок 4.1).
Получаем из МСК координаты точек объекта в координатной системе камеры. Схема представлена на рисунке 4.2.
Основные функции для работы с камерой представленны на рисунках 4.3, 4.4, 4.5.
Для того чтобы получить координаты точки, представленной в мировых координатах, в координатах камеры необходимо эту точку умножить на матрицу камеры трансформации из МСК. Точку следует представить в однородных координатах. Матрица трансформации камеры приведена на рисунке 4.6. В этой матрице U – вектор «вправо», V – вектор «вверх», N – вектор «вперед», camPos – позиция камеры в МСК.
После получения координат объекта в системе координат камеры получаем аксонометрическую проекцию объекта на плоскости проекций камеры. На рисунке 4.7 приведена упрощенная двумерная проекция плоскости обзора на плоскость xz. Примем угол обзора FOV равным 90 градусов, а расстояние от камеры до плоскости проекций d равным 1.
На рисунке 4.8 показан пример построения аксонометрического преобразования.
Перед нахождением перспективной проекции, нужно отсечь полигоны по пирамиде видимости (рис. 4.9).
Алгоритм перспективного проецирования объекта и отсечение по пирамиде видимости представлен на рисунке 4.10.
5. Программная реализация
Пример ввода параметров объекта представлен на рисунке 5.1
Примеры работы программы представленны на рисунках 5.2, 5.3, 5.4, 5.5.
Выводы
В ходе разработки проекта была создана программная система, которую можно использовать как наглядный пример проектирования простейших трехмерных систем по визуализации некоторых объектов. Также система позволяет продемонстрировать на примере работу некоторых основных алгоритмов компьютерной графики, запрограммированных на языке высокого уровня.
В разработанной системе обеспечено наличие настраиваемого аппарата проецирования, реализовано параллельное и центральное проецирование. Реализована возможность управления камерой, наличие средств сохранения и загрузки параметров объекта.
Достоинствами данной системы является ее простота, наглядность, достаточно удобный интерфейс и простота представления сходных и выходных данных программы. Недостаткам программы является ее низкая защищенность внешним воздействиям и большой размер кода.
Полезные ресурсы
- Роджерс Д. «Алгоритмические основы машинной графики»: Пер. с англ.-М.:Мир, 1989.-512с.
- Рождерс Д., Адамс Дж. «Математические основы машинной графики»: Пер. с англ.- М.: Мир, 2001.-604с.
- Вангер Ф.С. «Справочник по трехмерному моделированию», СПб, 2002г.
- Ламот Андре. Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации.: Пер. с англ.–М.: Издательский дом «Вильяме», 2004.-1424с.: ил.- Парал. тит. англ.
- Френк Д. Луна «Введение в программирование трехмерных игр с DirectX 9.0», Wordware Publishing, 2003.
- Alan Watt «3D Computer Graphics» 3-е изд. Addison-Wesley, 2000
- Форум для разработчиков игр и программистов 3D графики [Электронный ресурс]: – Режим доступа: http://www.gamedev.ru