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

Щиты

Щиты (billboard) — это мощная техника, позволяющая двухмерным объектам присутствовать в трехмерном окружении. Например, для сложного объекта, такого как дерево, в программе моделирования может быть создан вид сбоку, который потом будет накладываться как текстура на прямоугольник. Этот прямоугольник всегда будет обращен к зрителю, поэтому независимо от угла, под которым рассматривается прямоугольник, будет казаться, что текстура дерева рассматривается с той же самой точки, что и при ее создании (как показано на рис. 2.21).


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

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


Многие программисты при создании игр применяют щиты из-за простоты реализации. Замечательный пример использования щитов можно увидеть в игре Paper Mario для N64. Все персонажи нарисованы в виде двухмерных изображений, а затем эти текстуры накладываются на полигоны. В игру добавлен трюк, позволяющий видеть, как вращаются вокруг полигоны щитов, что придает графике комичный стиль.

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

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

Углы точки просмотра хранятся в переменных XRot, YRot и ZRot, а координаты объекта щита — в переменных XCoord, YCoord и ZCoord. Вот как надо инициализировать матрицу, используемую для визуализации буфера вершин этого щита:

// g_pD3DDevice = ранее инициализированный объект устройства
D3DXMATRIX matBillboard;
D3DXMATRIX matBBXRot, matBBYRot, matBBZRot;
D3DXMATRIX matBBTrans;

// Конструируем матрицу щита
// Для выравнивания используем углы, противоположные
// углам просмотра
D3DXMatrixRotationX(&matBBXRot, -XRot);
D3DXMatrixRotationY(&matBBYRot, -YRot);
D3DXMatrixRotationZ(&matBBZRot, -ZRot);

// Используем координаты объекта щита для размещения
D3DXMatrixTranslation(&matBBTrans, XCoord, YCoord, ZCoord);

// Комбинируем матрицы
D3DXMatrixIdentity(&matBillboard);
D3DXMatrixMultiply(&matBillboard, &matBillboard, &matBBTrans);
D3DXMatrixMultiply(&matBillboard, &matBillboard, &matBBZRot);
D3DXMatrixMultiply(&matBillboard, &matBillboard, &matBBYRot);
D3DXMatrixMultiply(&matBillboard, &matBillboard, &matBBXRot);

// Устанавливаем матрицу
g_pD3DDevice->SetTransform(D3DTS_WORLD, &matBillboard);

// Далее можно рисовать буфер вершин, который будет выровнен
// относительно точки просмотра, с правильными координатами

После последней строки кода матрица мирового преобразования установлена и готова к использованию при визуализации объекта щита.

Вторым способом создания мировой матрицы щита является получение от Direct3D текущей матрицы вида и ее транспонирование (инвертирование). Эта транспонированная матрица выровняет все относительно зрителя требуемым образом. Вы просто применяете матрицу перемещения сетки, чтобы сетка находилась в требуемом месте вашего мира. Затем вы конструируете матрицу щита из матрицы вида и используете ее для рисования объекта щита:

// g_pD3DDevice = ранее инициализированный объект устройства
D3DXMATRIX matTrans, matWorld, matTransposed;

// Получаем текущую матрицу вида Direct3D
g_pD3DDevice->GetTransform(D3DTS_VIEW, &matTranspose);

// Создаем матрицу перемещения сетки
D3DXMatrixTranslation(&matTrans, XCoord, YCoord, ZCoord);

// Перемножаем матрицы, чтобы получить матрицу мирового преобразования
D3DXMatrixMultiply(&matWorld, &matTranspose, &matTrans);

// Устанавливаем матрицу мирового преобразования
g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);

// Далее можно рисовать буфер вершин, который будет выровнен
// относительно точки просмотра, с правильными координатами

Щиты — это мощная техника, которая является основой для ряда других эффектов, таких как частицы.


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

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