Шаг 25 - Грани, вершины и их вектора нормали

Каждая грань объекта имеет перпендикулярный вектор нормали. Вектор определяет направление вершин, в котором они находится (в левосторонней или правосторонней системе координат). В Direct3D Вы видите только передние грани (лица). На таких гранях вершины распределяются по часовой стрелке.

25_1.gif (3746 b)

Любая грань, которая является не передним, является задним (или обратным). Direct3D всегда не отображает задние грани. Вы, если захотите, можете изменить способ отображения, чтобы обратная сторона появилась. Для более полной информации смотрите Режим выбора.

Приложение Direct3D не должна определять нормаль грани; система их вычисляет автоматически, когда это необходимо. Система использует нормаль грани для режима плоской закраски (для плоских объектов). В режиме закраски Гуро (Gourand), Direct3D использует нормали вершин. Также нормали вершин можно использовать для создания эффектов над текстурами и освещения.

25_2.gif (2438 b)

Когда Вы применяете закраску Гуро (Gourand) к многоугольнику, Direct3D использует нормали вершин, чтобы вычислить угол между источником освещения и поверхностью многоугольника. Это рассчитывает цвет и значение интенсивности для вершины и интерполирует их для каждой точки поверхности всего примитива. Direct3D вычисляет значение интенсивности используя угол. Чем больше угол, тем меньше отражается свет от поверхности.

Если Вы создали объект, стороны которого являются плоскими, то нормали вершин будут направлены перпендикулярно поверхности, как показано ниже на рисунке:

25_3.gif (1584 b)

У Вас может быть ситуация, когда объект составлен сверху из нескольких треугольников и треульники не копланарные. Единственный простой способ добиться плавной закраски всех треугольников, это сначала вычислить вектор нормали поверхности для каждого лица многоугольника с которым вершина связана. И установить вектор нормали так, чтобы угол был равный между всеми векторами нормали поверхности. Но этот метод недостаточно эффективен для некоторых примитивов. Ниже, на рисунке, показана некая фигура у которой есть две поверхности S1 и S2, соединяющиеся в верхней части. Вектор нормали поверхностей S1 и S2 отображается синим цветом. Нормаль самой вершины показан красным цветом. Угол между нормалью поверхности S1 и нормалью вершины одинаковый с углом между нормалью поверхности S2 и этой же нормали вершины. Когда эти две поверхности будут освещены и закрашены методом Гуро (Gourand), получите результат гладкого (закругленного) края между поверхностями.

25_4.gif (2618 b)

Если вектор нормали отклонился к одному из лиц, к которым он связан, это увеличит или уменьшит отражаемый свет к той или иной поверхности, в зависимости от угла к источнику. Посмотрите на нижний рисунок:

25_5.gif (2474 b)

Вы можете воспользоваться закраской Гуро (Gouraud), чтобы показать некоторые объекты в трехмерной сцене с острыми гранями.

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

25_6.gif (2532 b)

Если Вы используете функцию DrawPrimitive для отображения сцены, определите объект с острыми гранями в списке треугольников. Когда Вы инициализируете объект из множества треугольников, Direct3D обратится к ним, как объект состоящий их большого количества треугольников. Закраску Гуро (Gourand) можно применить не только к граням многоугольника, но и к смежным граням. В результате Вы получите объект с гладкой поверхностью от грани к грани. Поскольку список треугольников - это многоугольник, состоящий из нескольких непересекающихся треугольных граней, Direct3D применяет закраску Гуро (Gouraud) к каждой грани многоугольника. Но если имеются в списке (массиве) два и более смежных треугольника, то они будут иметь острый край между собой.

Поэтому нужно применить другую плоскую закраску, перед тем как объект отобразится с острыми ребрами. Этот способ наиболее эффективный, но он может создать объекты в сцене не так реалистично, как к объектам применяя закраска Гуро (Gouraud).


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Хавов Евгений Валерьевич - 17.08.2002