- •Г.М. Набережнов, н.Н. Максимов трехмерное моделирование полигональными сетками
- •Казань 2008 Задания для самостоятельного выполнения
- •1. Понятие полигональнОй сетки
- •2. Построение полигональной сетки
- •3. Рисование полигональной сетки
- •4. Введение в модели закрашивания
- •5. Использование источников света в OpenGl
- •5.1. Создание источника света
- •5.3. Ослабление света с расстоянием
- •5.4. Перемещение источников света
- •5.2. Прожекторы
- •6. Работа со свойствами материалов в OpenGl
1. Понятие полигональнОй сетки
Полигональные сетки являются просто набором полигонов, или «граней», которые в совокупности формируют «оболочку» объекта. Сетки в графике являются стандартным способом представления широкого класса форм. Популярность полигональных сеток в графике основана на простоте использования полигонов: их легко представлять (последовательностью вершин) и преобразовывать, у них простые свойства (единственный нормальный вектор, четко определяемые внутренняя и внешняя области и т.д.); кроме того, их просто рисовать.
Многие системы визуализации, в том числе OpenGL, основаны на изображении объектов посредством рисования последовательности полигонов. Каждая грань полигона посылается в графический конвейер, где ее вершины подвергаются различным преобразованиям, и та часть грани, которая осталась после отсечения, закрашивается или «затеняется» и демонстрируется на устройстве отображения.
Полигональная сетка задается списком полигонов и информацией о направлении, куда «обращен» каждый полигон. Информация о направлении часто задается в виде нормали к плоскости его грани. Эта информация используется при закрашивании объекта для определения того, сколько света от источника рассеивается на этой грани.
2. Построение полигональной сетки
Оказывается, выгоднее связывать нормальный вектор с каждой вершиной грани, чем задавать одну нормаль для целой грани, подобная практика упрощает процесс отсечения и процесс закрашивания для гладких криволинейных форм. Для плоских поверхностей, каждая из вершин v1, v2, v3, будет ассоциирована с одной и той же нормалью n0, которая является нормальным вектором для всей грани (рис. 2.1).
На рис. 2.1 и 2.2 показан тетраэдр. Он имеет 4 полигональные грани и 4 вершины (каждая из которых одновременно принадлежит трем граням). У тетраэдра имеется всего 4 различных нормальных векторов: по одной на каждую грань, как показано на рис. 2.2.


Существует много различных способов хранения информации о сетке в файле или в программе. Для данного тетраэдра можно использовать список из четырех полигонов и для каждого из них список, содержащий вершины полигона и нормали в каждой из этих вершин (всего 12 вершин и 12 нормалей). Однако такая структура была бы избыточной и громоздкой, поскольку у нас всего 4 различные вершины и 4 различные нормали.
Б
олее
эффективным является подход, при котором
используются три отдельных списка:
список вершин, список нормалей
и список граней. В списке вершин
содержаться координаты различных вершин
сетки. В списке нормалей описываются
направления различных нормальных
векторов, которые имеются в данной
модели. Список граней является просто
индексом для остальных двух списков.
Таблица 1. Список вершин для тетраэдра
|
Вершина v |
x |
y |
z |
|
0 |
0 |
0 |
0 |
|
1 |
1 |
0 |
0 |
|
2 |
0 |
1 |
0 |
|
3 |
0 |
0 |
1 |
Т
аблица
2. Список различных встречающихся
нормалей
|
Нормаль n |
x |
y |
z |
|
0 |
0.577 |
0.577 |
0.577 |
|
1 |
0 |
0 |
-1 |
|
2 |
-1 |
0 |
0 |
|
3 |
0 |
-1 |
0 |
Все три списка работают совместно: список вершин содержит информацию об их координатах, или геометрии; список нормалей содержит информацию об ориентации; а список граней содержит информацию о связности, или топологии.
Список вершин для нашего тетраэдра приведен в табл. 1. Список из четырех различных нормалей приведен в табл. 2. индексы вершин и нормалей изменяются от 0 до 3. Все векторы, приведенные в списке нормалей, уже нормированы, поскольку для большинства алгоритмов закраски требуются единичные векторы.
|
Грань f |
Вершины v |
Ассоциированная нормаль n |
|
0 |
1, 2, 3 |
0, 0, 0 |
|
1 |
0, 2, 1 |
1, 1, 1 |
|
2 |
0, 3, 2 |
2, 2, 2 |
|
3 |
1, 3, 0 |
3, 3, 3 |

В табл. 3. приведен список граней тетраэдра: у каждой грани имеется свой список вершин и нормальный вектор, ассоциированный с каждой вершиной. Для экономии пространства вместо вершин и нормалей используются только индексы.
(Поскольку каждая поверхность плоская, всем вершинам одной грани соответствует одна и та же нормаль). Список вершин для каждой грани начинается с какой-либо вершины на этой грани и обходит эту грань от вершины к вершине до тех пор, пока не будет пройден полный круг. Существует два способа обхода полигона: по и против часовой стрелки. Например, грань f2 может быть внесена в список как (v0, v3, v2) или как (v2, v3, v0). Можно использовать любое направление, однако мы следуем соглашению, которое принято на практике: обходим полигон против часовой стрелки, если смотреть на объект снаружи.

