ДонНТУ   Портал магистров

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

Содержание

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 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.2 – Формулы преобразования координат точки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 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