39. Определение нормали к поверхности и вектора отражения ( 4 способа) в алгоритмах построения реалистических изображений. - p1xelse/CG GitHub Wiki

Определение нормали к поверхности

Определение нормали зависит от способа задания поверхности.

  1. Если поверхность задана аналитически F(x, y, z) = 0, то нормаль вычисляется через градиент в точке grad(F(x, y, z)).
  2. Для полигональных моделей нормаль совпадает с нормалью соответствующего полигона и вычисляется через векторное произведение двух ребер. (или задаётся заранее).

N = N1 + N2 + N3, где N1, N2, N3 - нормали граней инцидентных вершине в которой ищется нормаль.

N = v1*v2 + v2*v3 + v3*v1, где v1-v3 - векторы ребер инцидентных вершине в которой ищется нормаль.

Нормаль в точке схода плоскостей полигональной модели равна среднему значению нормалей всех сходящихся в этой точке плоскостей. Если плоскости заданы не аналитически, то нормаль ищется как усредненное векторное произведение всех ребер, сходящихся в вершине. Чем больше площадь грани, тем больше будет вклад векторного произведения в результат.
Вычислять нормаль необходимо до перспективного деления, иначе направление нормали будет искажено, что приведет к неправильному определению интенсивности освещения.

image

Определение вектора отражения

Основная идея: по закону отражения вектор падающего света, нормаль к поверхности и вектор отражения лежат в одной плоскости, причем на этой плоскости угол падения равен углу отражения.
Существует диффузное и зеркальное отражение. При диффузном отражении свет поглощается поверхностью на которую падает и вновь излучается этой поверхностью по всем направлениям и цвет света совпадает с цветом поверхности. Блеклая, матовая. При зеркальном отражении отраженный свет концентрируется вокруг вектора отражения, то есть это направленное отражение. Цвет зеркально отраженного света совпадает с цветом падающего света.
Учесть факт того, что происходит отражение не строго по вектору отражения а вблизи его можно возведением косинуса в степень. Чем выше степень, тем более концентрированное распределение. Рассмотрим 4 наиболее общих способа определения вектора отражения.

  1. Фонг вывел решение для случая, когда свет падает вдоль оси z. Это предположение удобно использовать для модели освещения с одним точечным источником. Если начало системы координат перенести в точку поверхности, то проекция нормали и вектора отражения на плоскость xy будут лежать на одной прямой. Обозначим угол между единичным вектором нормали и осью z через teta. Тогда составляющая вектора нормали по оси z равна cos(teta).

.

.

.

.

.

Тогда итоговые формулы для составляющих вектора отражения будут:

  1. Когда свет не падает по оси z или источников несколько такой метод не подходит.
    Используется следующий метод. Нормаль поворачивается параллельно оси z а точка Р принимается за начало координат.
    Тогда плоскость xy будет касательной к поверхности, а x-, y-составляющие векторов падения и отражения будут иметь разные знаки, а z-составляющая будет одинаковой. Далее выполняется обратное преобразование и получаются координаты вектора отражения в исходной системе координат.

  1. Также можно использовать векторное произведение. Равенство углов падения и отражения записывается следующим образом

4.Чисто аналитический способ.

Угол падения обозначается t, вектор R представляется суммой векторов L и n с некоторыми коэффициентами alpha beta. Далее решается система из двух уравнений и находятся эти коэффициенты

.

.

.

.

.

.

.

.

.

.

.