Цель создания этого документа - дать начальные представления о нормалях и о их использовании в 3D графике.
Так же будем считать, что не требуется объсянять основы математики векторов (в частности dot product и cross product).
.
Что такое "нормаль"?
Так что же такое нормаль? Нормаль представляет направление в пространстве и имеет параметры (x,y,z), как и любой вектор.
Особенностью нормали можно назвать то, что ее длина всегда равна 1. То есть:
Sqrt(x2+y2+z2) = 1
Как расчитывается нормаль? Для начала возьмем три точки (a,b и c). По этим точкам необходимо вычислить
вектора p (из точки a в b) и q (из a в с):
p = b - a q = c - a
Получив два этих вектора вычисляем нормаль как перекрестное произведение векторов p и q с нормализацией
результата. Это можно представить в псевдокоде как:
n = Cross(p, q); Normalize(n);
Для нормализации результата необходимо разделить каждый параметр вектора на его длину, которая вычисляется как:
length = Sqrt(x2+y2+z2);
Теперь мы можем перейти к понятию плоскости.
.
Что такое плоскость?
Выражение, определяющее плоскость очень важно в программировании 3D графики. Приведу это выражение:
Ax + By + Cz + D = 0
Коэффиценты A, B и C равны параметрам x, y и z вектора нормали. Коэффицент D
численно равен расстоянию от плоскости до начала координат. Вычислить D можно как произведение любой точки плоскости и
вектора нормали, взятое с обратным знаком. Поскольку точки a, b и c уже известны, то D можно определить как:
D = - Dot(n, a)
Теперь мы легко можем отределить положение точки относительно плоскости. Например есть точка p1. Тогда:
value = (A * p1.x) + (B * p1.y) + (C * p1.z) + D;
Значение value определит положение точки:
value
Положение
< 0
Точка за плоскостю, на расстоянии равном value
= 0
Точка на плоскости
> 0
Точка перед плоскостю, на расстоянии равном value
Так же отсюда можно получить формулу для вычисления расстояния от плоскости до точки.
distance = Dot (n, p1) + D
.
Нормали вершин?
Нельзя вычислить нормаль для вершины, потому что это всего лишь точка в пространстве. Однако можно произвести приблизительный расчет.
При понимании идей расчета нормалей для плоскостей и граней, нормали для вершин можно вычислить без особого труда.
Нормалью вершины будет являться среднее от нормалей окружающих его граней. Таким образом, определив соседние грани мы можем легко определить
нормаль для данной вершины. Вот примерный алгоритм расчета: создаем переменную n, которая представят собой вектор и инициализируем ее
в (0,0,0). Теперь необходимо создать цикл по всем вершинам и для каждого вершины определяем грань, в которую она входит. Если в эту грань так
же входит и вершина, для которой мы производим расчет, то нормаль данной грани суммируется с n. Таким образом мы получаем сумму нормалей.
Остается только поделить вектор n на количество вершин участвоваших в формировании смежных граней и нормализовать n.
.
Способы применения
Для чего можно использовать эти формулы? Я подскажу некоторые аспекты использования. Как уже упоминалось ранее, эти формулы можно
использовать для вычисления расстояния от точки до плоскости и для определения принадлежности точки плоскости. Так же для
определения столкновений (collision detection), расчете деревьев BSP, отсечение невидимых поверхностей,
расчете освещения, в environment mapping.
.
Вместо заключения
При написании данной статьи был использован материал "The World of Normals and Planes" написанный Nate Miller.
Его страничка ноходится по адресу: http://nate.scuzzy.net/ .