Загрузка...
 
Печать

Базовые понятия 3D-графики


Рис. 1 Вершины, рёбра и грани - основные элементы для создания 3D-объектов
Рис. 1 Вершины, рёбра и грани - основные элементы для создания 3D-объектов

Вершина (Vertice)

  • Наименьшая единица изображения в графическом пространстве.
  • Представляет собой точку (с координатами), размещённую в 2D или 3D пространстве.

Абсолютно всё в 3D-игре представлено в виде 3D-точек (См. Рис.1). Существует два основных способа вывода 3D-объектов на экран: набросать (plot) точки самостоятельно, либо загрузить их из готового файла 3D-модели (в котором сохранены все точки, составляющие модель).

Ребро (Edge)

  • Это отрезок (линия), соединяющий две вершины.

Полигон

  • Обычно это плоский треугольник, состоящий из трёх вершин (и трёх граней).

Всё, что рисуется в Direct3D состоит из полигонов. В теории полигоны могут состоять из 4, 5, 6 и даже более вершин. Но на практике почти повсеместно (и в Direct3D) применяют треугольные полигоны.

Закрыть
noteЛюбопытный факт

Исключением в своё время стала игровая консоль Sega Saturn, увидевшая свет в 1994 году, которая "понимала" только четырёхугольные полигоны. Поначалу это представляли как фичу, но на деле такой нестандартный полигон обернулся головной болью для разработчиков. Т.к. абсолютно все системы до этого оперировали только треугольниками.


Вершины, рёбра и полигоны можно представить в виде настольной игры "соедини точки", где точки - вершины, а соединяющие их линии - рёбра.

Грань (Face)

Один и более полигонов образуют грань.

Меш (сетка, mesh)

  • Состоит из одной и более граней.
  • Заключает в себе 3D-объект (модель; обычно неанимируемую, т.к. по умолчанию она пуста внутри).

Материал

  • Используется для более реалистичного вида 3D-объекта (меша), заполняя пустые полигоны меша определёнными цветами.
  • Представлен комбинацией цветовых компонентов, либо растровым изображением (текстура, bitmap), которое "натягивается" на поверхность полигона перед рендерингом.

Рис.2 Различия между 2-мя типами Картезианской системы координат
Рис.2 Различия между 2-мя типами Картезианской системы координат

Система координат (Coordinate system)

Ты, должно быть, ранее сталкивался с 2D-координатами при работе с растровыми изображениями. Они имеют ширину (width) и высоту (height), измеряемые в пикселах. Горизонтальная ось измерения рассматривается как ось X, вертикальная - как ось Y. Точкой отсчёта в такой системе является левый верхний угол изображения. В Direc3D 2D (двухмерные) координаты рассматриваются как трансформированные координаты (transformed coordinates), т.к. они представляют собой финальные (после всех преобразований) координаты, используемые для вывода объектов на экран. В трёхмерном пространстве (3D space) к началу двух осей добавляется третья - z.
Исходя из своего названия, Direct3D производит рендеринг 3D-объектов. Все эти объекты имеют свою позицию в 3D-пространстве. Для определения местоположения любого 3D-объекта используют набор координат - x, y, z.1 Такая система координат называется Картезианской и подразделяется на 2 типа:

  • направление оси z определяется по правилу правой руки (праворучная, right-handed);
  • направление оси z определяется по правилу левой руки (леворучная, left-handed).

Direct3D для представления объектов в 3D-пространстве использует леворучную Картезианскую систему координат.
В обоих видах данной коорд. системы координаты x и y вычисляются точно также, как это делается в "плоской" двухмерной системе координат (положительные координаты по оси x откладываются в правую сторону от нулевой координаты, по оси y - вверх). Когда эта двухмерная система переходит в 3D, добавляется третье измерение, которое измеряется по оси z. В леворучной координатной системе ось z направлена в сторону, противоположную наблюдателю, а в праворучной - направлена на него (См. Рис.2).
Абсолютно всё в 3D-пространтсве измеряется в этих координатных системах.

Рис.3 Локальное и мировое пространства
Рис.3 Локальное и мировое пространства

Создание объектов (Constructing objects)

Создание любого объекта начинается с вершин. Каждая вершина имеет координаты x, y и z. Какие бы координаты не были присвоены вершине, они будут рассматриваться в трёх разных пространствах:

  • Пространство экрана (Screen space; с использованием трансформированных координат);

Применяется для создания вершин в координатах экрана.

  • Пространство модели (Model space; с использованием нетрансформированных координат);

Также её называют локальное пространство (Local space). Представляет собой координаты, отсчитываемые от условного центра (начала координат) модели.

  • Пространство мира (World space; также с использованием нетрансформированных координат).

Перед рендерингом вершины, размещённые в локальном пространстве, конвертируются в мировое пространство. Во время рендеринга координаты, размещённые в мировом пространстве, снова конвертируются в координаты экранного пространства (Screen space).
Вершины, размещённые в мировом пространстве, имеют финальные координаты, используемые при рендеринге объекта. К примеру, представь самого себя в виде меша. Твои суставы представляют собой вершины, которые изначально определены в локальном пространстве, т.к. за точку отсчёта при этом взят условный локальный центр координат, расположенный по центру твоей груди.
При передвижении по дому (который представляет собой мировое пространство), координаты твоих суставов также перемещаются относительно мира, но (вцелом) остаются неподвижны относительно твоего тела (см. Рис.3).
После выбора типа координат для прорисовки объекта (в локальном, экранном или мировом пространстве), мы размещаем вершины (нумеруя их по порядку, в котором они размещаются). Затем эти вершины объединяются в группы по 3 штуки, образуя треугольные полигональные грани (polygon faces).

Рис. 4 Треугольный список (list) не имеет общих вершин с другими полигонами. Объединяя полигоны в треугольные полосы (strips) и вентиляторы (fans), мы сокращаем число вершин, тем самым экономя ресурсы и увеличивая производительность.
Рис. 4 Треугольный список (list) не имеет общих вершин с другими полигонами. Объединяя полигоны в треугольные полосы (strips) и вентиляторы (fans), мы сокращаем число вершин, тем самым экономя ресурсы и увеличивая производительность.

Треугольные списки (Lists), полосы (Strips) и вентиляторы (Fans)

В зависимости от наличия/отсутствия у близлежащих полигонов общих вершин выделяют 3 вида полигональных примитивов:

  • Треугольный список (Triangle list)

- набор вершин, не имеющий общих вершин с другими полигонами.

  • Треугольная полоса (Triangle strip)

- набор (треугольных) граней с общими вершинами, расположенными так, что каждый полигон имеет одно общее ребро с соседним.

  • Треугольный вентилятор (Triangle fan)

...образуется когда несколько граней имеют одну общую вершину. Почти также, как и у реального вентилятора (см. Рис.4).

Порядок указания вершин (Vertex ordering)

  • Важен, т.к. от него зависит определение т.н. "лицевой" стороны грани (т.е. которую видит зритель).

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

Закрыть
noteОбрати внимание

В Direct3D (версия 9 и выше) систему координат можно изменять на праворучную. В этом случае для корректного определения лицевой стороны грани вершины указываются против часовой стрелки.

Закрыть
noteОбрати внимание

Начиная с версии 8, для отрисовки 2D-объектов (отрезки, пиксели) DirectX использует исключительно Direct3D (в составе DirectX Graphics). И эти объекты представлены здесь в качестве 3D-объектов, хотя на самом деле таковыми не являются. С точки зрения Direct3D, пиксели являются полигонами с одной вершиной, а отрезки - с двумя. В Direct3D отрезки и пиксели создаются с помощью треугольных списков (Triangle lists).

Закрыть
noteОбрати внимание

В большинстве 3D-движков и в Direct3D обратная сторона грани (по умолчанию) не рендерится и не выводится на экран. Такой метод оптимизации называется отсечением обратной стороны грани (backface culling).

Окрашивание полигонов

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

Материал (Material)

  • обычно представляет собой окрашивание поверхности сплошной заливкой определённого (статичного) цвета.

Материал состоит из нескольких компонентов:

  • цвет рассеяного света (diffuse)
  • цвет окружающего освещения (ambient)
  • цвет отражённого света (specular)

- это цвет блика (highlight), когда близко расположенный источник света освещает объект.
Часто diffuse и ambient объединяют в один компонент diffuse, представляющий собой собственный цвет объекта.

Текстурирование (Texture mapping)

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

Матрицы (Matrices)

В Direct3D матрицей нзывается таблица данных размером 4Х4. Это двумерный массив. Матрица идентичности (identity matrix), она же единичная матрица (unit matrix), схожа с числом 1. К примеру если мы перемножим любое другое число на 1, то в результате всегда получим исходное число (5 * 1 = 5).
Произведением произвольной матрицы и единичной матрицы является та же самая исходная произвольная матрица. Единичная матрица очень широко применяется как сама по себе, так и совмествно с другими матрицами. Её отдельные поля структурированы по строкам и столбцам вида 4х4. Это позволяет выполнять внутри одной матрицы множество различных преобразований (трансформаций, transformations). Для хранения матриц XNA предоставляет структуру Matrix.

Рис.5 При размещении 3D-объектов в их локальном пространстве, их также можно размещать в мировом пространстве 3D-сцены.
Рис.5 При размещении 3D-объектов в их локальном пространстве, их также можно размещать в мировом пространстве 3D-сцены.

Трансформации (Transformations)

После того, как ты определил модель (или просто набор полигонов), его размещают в 3D-пространстве на определённой позиции. При этом объект не просто стоит, но и способен перемещаться, вращаться и изменять свои размеры. Это также позволяет, единожды загрузив модель, создать из неё несколько её копий (объектов), зафиксированных в различных позициях (см. рис. 5).
Такие преобразования объекта называют трансформациями и выполняются путём применения к объекту математических матриц преобразования (transformation matrices). В игрокодинге существуют 3 основных вида преобразований объекта:

  • Трансляция (Translation; изменение положения в пространстве);

Трансляция означает обычное перемещение объектов в 3D-пространстве. Мы транслируем объект из одной точки в другую путём корректного перемещения каждой точки объекта.

  • Масштабирование (Scaling);

Масштабирование объекта делает объекты больше или меньше. Это достигается за счёт изменения расстояний между точками объекта.

  • Вращение (Rotation).

Вращение объекта вращает объект по одной или нескольким осям. Перемещая точки объекта соответствующим образом в 3D-пространстве мы можем заставить наш объект крутиться словно волчок.
Все они применяются к объекту в определённом порядке.

Закрыть
noteОбрати внимание

Трансляция является одной из трёх трансформаций. Наряду с масштабированием и вращением.

Каждый объект перед выводом на экран проходит следующие этапы трансформации:

Мировая трансформация (World transformation)

  • Применяется для конвертации локальных (local) координат объекта в мировые (world).

Здесь выполняется изменение масштаба объекта (scaling), его вращение (rotation) по осям X, Y и Z (иногда по всем сразу) и трансляция. Причём выполняются они именно в таком порядке.

Трансформация вида (View transformation)

  • Ориентирует объекты сцены в 3D-пространстве относительно положения зрителя (=виртуальной камеры, viewer).

При этом мировые координаты объекта конвертируются в координаты вида (view coordinates).

Трансформация проекции (Projection transformation)

  • "Сплющивает" 3D-изображение в 2D-картинку, выводимую на экран монитора.

Работает примерно так же как линзы камеры. Здесь можно изменить увеличение (zoom), сделать изображение широкоугольным, или наоборот, сузить панораму + можно добавить ряд эффектов. Например т.н. искажение "рыбий глаз" (Fish eye).

К объекту в данный момент времени может быть применена одна или несколько трансформаций одновременно. К примеру нам необходимо только транслировать (=переместить) объект, для чего достаточно обновить (update) мировую матрицу объекта (object's world matrix). Затем нам может понадобиться повернуть объект под одной из осей, для чего применим к нему трансформацию вращения. Обычным делом является масштабирование (изменение размера объекта) после его загрузки из 3D-редактора в игровой мир. Здесь применяется трансформация масштабирования. Часто все эти трансформации применяют одновременно. Иногда объект необходимо повернуть не более чем на 5 градусов. И матрица вращения позволяет это с лёгкостью сделать.
Мы может применять к объекту множество различных трансформаций путём перемножения (multiplaying) различных матриц друг на друга. Но здесь есть свои "подводные камни". Мы перемножаем матрицы друг на друга для достижения желаемого результата. Но в отличие от числовых множителей, когда от перестановки множителей произведение не изменяется, при перемножении матриц их порядок имеет ключевое значение. Т.е. Матрица A * Матрица B != (не равно) Матрица B * Матрица A.

Источники:


1. Young V. Programming a Multiplayer FPS in DirectX 9.0. - Charles River Media. 2005

Contributors to this page: slymentat .
Последнее изменение страницы Воскресенье 10 / Май, 2020 11:12:31 MSK автор slymentat.

Помочь проекту

Яндекс-деньги: 410011791055108