Составители:
Рубрика:
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