netlib.narod.ru< Назад | Оглавление | Далее >

2.1. Представление моделей

Сценой (scene) называется набор объектов или моделей. Объект представляется с помощью сетки с треугольными ячейками (triangle mesh), как показано на рис. 2.2. Отдельные треугольники сетки — это строительные блоки с помощью которых мы моделируем объекты. Чтобы сослаться на треугольник сетки мы будем использовать следующие взаимозаменяемые термины: полигон, примитив и ячейка сетки. (Треугольники являются примитивами, но Direct3D поддерживает еще два вида примитивов: линии и точки. Однако, поскольку линии и точки не слишком полезны для моделирования трехмерных твердых объектов, мы опустим обсуждение этих примитивов. О некоторых применениях точек мы поговорим в главе 14.)


Рис. 2.2. Ландшафт, представленный с помощью сетки из треугольников

Рис. 2.2. Ландшафт, представленный с помощью сетки из треугольников


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


Рис. 2.3. Треугольник, заданный тремя вершинами

Рис. 2.3. Треугольник, заданный тремя вершинами

2.1.1. Форматы вершин

Приведенное выше определение вершин верно с математической точки зрения, но в контексте Direct3D является неполным. Это вызвано тем, что в Direct3D у вершины могут быть дополнительные свойства, помимо ее местоположения. Например, вершине может быть назначен цвет или с ней может быть связана нормаль (цвет будет обсуждаться в главе 4, а нормали — в главе 5). Direct3D обладает значительной гибкостью и позволяет нам конструировать собственные форматы вершин; другими словами, он позволяет нам указать, какая информация будет содержаться в данных вершины.

Чтобы создать собственный формат вершин нам сначала необходимо создать структуру, которая будет хранить необходимые нам данные вершины. Ниже для примера мы приводим два различных формата вершин: один хранит местоположение и цвет, а другой — местоположение, нормаль и координаты текстуры (о текстурах рассказывается в главе 6).

struct ColorVertex
{
    float _x, _y, _z; // местоположение
    DWORD _color;     // цвет
};

struct NormalTexVertex
{
    float _x, _y, _z;    // местоположение
    float _nx, _ny, _nz; // вектор нормали
    float _u, _v;        // координаты текстуры
};

После того, как мы завершили объявление структуры данных вершины, нам необходимо описать формат хранения этих данных в структуре с помощью комбинации флагов настраиваемого формата вершин (flexible vertex format, FVF). Для первой из представленных выше структур данных вершин мы получаем следующее описание формата:

#define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE)

Это описание говорит о том, что структура данных вершины, соответствующая данному формату вершин содержит сведения о местоположении и информацию о цвете.

#define FVF_NORMAL_TEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

В этом описании говорится, что структура данных вершины, соответствующая данному формату, содержит данные о местоположении, нормали и координатах текстуры.

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

Полный список доступных флагов формата вершин вы найдете в документации по ключевому слову D3DFVF.

2.1.2. Треугольники

Треугольники являются основными строительными блоками трехмерных объектов. Чтобы сконструировать объект мы создаем список треугольников, описывающих его форму и контуры. Список треугольников содержит данные каждого треугольника, который мы будем отображать. Например, чтобы создать прямоугольник, мы разбиваем его на два треугольника, как показано на рис. 2.4, и задаем вершины каждого треугольника.


Рис. 2.4. Прямоугольник, образованный из двух треугольников

Рис. 2.4. Прямоугольник, образованный из двух треугольников


Vertex rect[6] = {v0, v1, v2,  // треугольник 0
                  v0, v2, v3}; // треугольник 1

 

ПРИМЕЧАНИЕ
Порядок, в котором задаются вершины треугольника очень важен и называется порядком обхода (winding order). Подробнее об этом мы поговорим в разделе 2.3.4.

2.1.3. Индексы

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


Рис. 2.5. Составленный из треугольников куб

Рис. 2.5. Составленный из треугольников куб


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

Vertex vertexList[4] = {v0, v1, v2, v3};

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

WORD indexList[6] = {0, 1, 2,  // треугольник 0
                     0, 2, 3}; // треугольник 1

Если облечь код в слова, определение массива indexList говорит, что треугольник 0 образован нулевым (vertexList[0]), первым (vertexList[1]) и вторым (vertexList[2]) элементами списка вершин, а треугольник 1 образован нулевым (vertexList[0]), вторым (vertexList[2]) и третьим (vertexList[3]) элементами списка вершин.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz