Основы построения 3-х мерных сцен с использованием библиотеки DirectX. Макушкина Л.А - 35 стр.

UptoLike

37
И массив
ADJ Adjacency [FaceNum]
Причем если треугольник состоит из индексов index1, index2, index3, то face1
- номер соседнего ему треугольника по ребру index1-index2, face2 - по ребру
index2-index3, face3 - по index3-index1.
Тогда алгоритм становится таким - сначала вычисляется ориентация всех
граней объекта относительно источника света (ориентацию определяет знак
скалярного произведения нормали треугольника и направления на источник
света), производится поиск всех ребер, которые лежат между треугольниками
разной ориентации. Вторую часть можно реализовать по-разному: можно
перебирать все ребра и смотреть ориентацию их треугольников, можно бегать по,
например, front-треугольникам и искать у них back-соседей или наоборот.
Псевдокод алгоритма:
Цикл (по всем граням объекта)
{
если Dot3 (normal, направление к источнику света) >= 0
записать что этот треугольник - front culled
иначе
записать что этот треугольник - back culled
}
Цикл (по всем front-culled граням объекта)
{
Цикл (по соседям треугольника)
если сосед back-culled
Добавить ребро с этим соседом в волюм.
}
Немного подробнее об операции "Добавить ребро с этим соседом в волюм".
Тут важно сделать у этого квада правильную ориентацию, потому что она очень
важна при отрисовке.
Детально это выглядит так -
Пусть front-culled треугольник, у которого есть back-culled сосед граничит с
ним по ребру из вершин с индексами index1 и index2 (порядок очень важен -
именно index1, а потом index2), тогда надо добавить в волюм две вершины (пусть
у них будут индексы index3 и index4), только с координатами
Verts [index3].pos = Verts [index1].pos + (Большое число) * lightdir.
Verts [index4].pos = Verts [index2].pos + (Большое число) * lightdir.
Большое число - это то, на какое расстояние происходит вытягивание
волюмов, чтобы они точно ушли за границу сцены.
После всех операций у квада волюма от этого ребра будут индексы (index2,
index1, index3) и (index4, index3, index1).
2. Отрисовка теневого объема
    И массив
ADJ Adjacency [FaceNum]
    Причем если треугольник состоит из индексов index1, index2, index3, то face1
- номер соседнего ему треугольника по ребру index1-index2, face2 - по ребру
index2-index3, face3 - по index3-index1.
    Тогда алгоритм становится таким - сначала вычисляется ориентация всех
граней объекта относительно источника света (ориентацию определяет знак
скалярного произведения нормали треугольника и направления на источник
света), производится поиск всех ребер, которые лежат между треугольниками
разной ориентации. Вторую часть можно реализовать по-разному: можно
перебирать все ребра и смотреть ориентацию их треугольников, можно бегать по,
например, front-треугольникам и искать у них back-соседей или наоборот.
    Псевдокод алгоритма:
Цикл (по всем граням объекта)
{
  если Dot3 (normal, направление к источнику света) >= 0
    записать что этот треугольник - front culled
  иначе
записать что этот треугольник - back culled
}

Цикл (по всем front-culled граням объекта)
{
  Цикл (по соседям треугольника)
    если сосед back-culled
      Добавить ребро с этим соседом в волюм.
}
    Немного подробнее об операции "Добавить ребро с этим соседом в волюм".
Тут важно сделать у этого квада правильную ориентацию, потому что она очень
важна при отрисовке.
    Детально это выглядит так -
    Пусть front-culled треугольник, у которого есть back-culled сосед граничит с
ним по ребру из вершин с индексами index1 и index2 (порядок очень важен -
именно index1, а потом index2), тогда надо добавить в волюм две вершины (пусть
у них будут индексы index3 и index4), только с координатами
Verts [index3].pos = Verts [index1].pos + (Большое число) * lightdir.
Verts [index4].pos = Verts [index2].pos + (Большое число) * lightdir.
    Большое число - это то, на какое расстояние происходит вытягивание
волюмов, чтобы они точно ушли за границу сцены.
    После всех операций у квада волюма от этого ребра будут индексы (index2,
index1, index3) и (index4, index3, index1).

    2. Отрисовка теневого объема


                                            37