Рис. 6.4. Представление «базового сарая» Существует много различных способов хранения информации о сетке в файле или в программе. Для данного сарая можно использовать список из семи полигонов и для каждого из них список, содержащий вершины полигона и нормали в каждой из этих вершин (всего 30 вершин и 30 нормалей). Однако такая структура была бы избыточной и громоздкой, поскольку у нас всего 10 различных вершин и семь различных нормалей.
Более эффективным является подход, при котором используются три отдельных списка"box" rules="all" border="0">
Вершина
У
Таблица 6.2. Список различных встречающихся нормалей
Нормаль |
пх |
пу |
т |
-1 | |||
-0,707 | 0,707 | ||
0,707 | 0,707 | ||
-1 | |||
-1 |
Список вершин для нашего сарая приведен в табл. 6.1. Список из семи различных нормалей приведен в табл. 6.2. Индексы вершин изменяются от 0 до 9, а индексы нормалей - от 0 до 6. Все векторы, приведенные в этом списке, уже нормированы, поскольку для большинства алгоритмов закраски требуются единичные векторы. (Напомним, что косинус угла между векторами равен скалярному произведению двух соответствующих ортов.)
Таблица 6.3. Список граней для стандартного сарая
Грань |
Вершины |
Ассоциированная нормаль |
0 (левая) |
0,5,9,4 | 0, 0, 0, 0 |
1 (крыша левая) |
3,4,9,8 | 1, 1, 1, 1 |
2 (крыша правая) |
2,3,8,7 | 2, 2, 2, 2 |
3(правая) |
1, 2, 7, 6 | 3, 3, 3/ 3 |
4 (нижняя) |
0, 1, 6, 5 | 4,4,4,4 |
5(передняя) |
5,6,7,8,9 | 5^ 5^ 5^ 5^ 5 |
6 (задняя) |
0,4,3,2,1 | 6, 6/ 6/ 6/ 6 |
В табл. 6.3 приведен список граней сарая: у каждой грани имеется свой список вершин и нормальный вектор, ассоциированный с каждой вершиной. Для экономии пространства вместо вершин и нормалей используются только индексы. (Поскольку каждая поверхность плоская, всем вершинам одной грани соответствует одна и та же нормаль.) Список вершин для каждой грани начинается с какой-либо вершины на этой грани и обходит эту грань от вершины к вершине до тех пор, пока не будет пройден полный круг. Существует два способа обхода полигона: по и против часовой стрелки. Например, грань № 5 может быть внесена в список как (5,6,7,8,9) или как (9,8,7,6,5). Можно использовать любое направление, однако мы следуем соглашению, которое принято на практике: обходим полигон против часовой стрелки, если смотреть на объект снаружи.