Поделиться через


Списки треугольников

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

Используем списки треугольников для создания объекта, состоящего из несмежных элементов. Например, один из способов создать силовую стену в 3D-игре — это задать большой список маленьких, несвязных треугольников. Затем необходимо применить к списку треугольников материал и текстуру, которые создают впечатление излучаемого света. Кажется, что каждый треугольник в стене светится. Сцена за стеной становится частично видимой через пробелы в треугольниках; именно таким образом игроки привыкли видеть силовое поле.

Списками треугольников также удобно пользоваться для создания примитивов, имеющих острые ребра и затененных по методу Гуро. См. раздел Нормальные векторы лиц и вершин (Direct3D 9).

На следующем рисунке показан отрисованный список треугольников.

иллюстрация отрисованного списка треугольников

В следующем коде показано, как создать вершины для такого списка треугольников.

struct CUSTOMVERTEX
{
    float x,y,z;
};

CUSTOMVERTEX Vertices[] = 
{
    {-5.0, -5.0, 0.0},
    { 0.0,  5.0, 0.0},
    { 5.0, -5.0, 0.0},
    {10.0,  5.0, 0.0},
    {15.0, -5.0, 0.0},
    {20.0,  5.0, 0.0}

};

В приведенном ниже примере кода показано, как отобразить этот список треугольников в Direct3D 9 с помощью IDirect3DDevice9::D rawPrimitive.

//
// It is assumed that d3dDevice is a valid
// pointer to a IDirect3DDevice9 interface.
//
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 );

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

CUSTOMVERTEX Vertices[] =
{
    {-5.0, -5.0, 0.0},
    { 0.0,  5.0, 0.0},
    { 5.0, -5.0, 0.0},
    { 5.0, -5.0, 0.0}, // degenerate triangle
    {10.0,  5.0, 0.0}, // degenerate triangle
    {10.0,  5.0, 0.0},
    {15.0, -5.0, 0.0},
    {20.0,  5.0, 0.0}
};

Примитивы