39. Определение нормали к поверхности и вектора отражения ( 4 способа) в алгоритмах построения реалистических изображений. - chrislvt/CG GitHub Wiki
Определение нормали к поверхности
Определение нормали зависит от способа задания поверхности.
- Если поверхность задана аналитически F(x, y, z) = 0, то нормаль вычисляется через градиент в точке grad(F(x, y, z)).
- Для полигональных моделей нормаль совпадает с нормалью соответствующего полигона и вычисляется через векторное произведение двух ребер. (или задаётся заранее).
N = N1 + N2 + N3
, где N1, N2, N3 - нормали граней инцидентных вершине в которой ищется нормаль.
N = v1*v2 + v2*v3 + v3*v1
, где v1-v3 - векторы ребер инцидентных вершине в которой ищется нормаль.
Нормаль в точке схода плоскостей полигональной модели равна среднему значению нормалей всех сходящихся в этой точке плоскостей. Если плоскости заданы не аналитически, то нормаль ищется как усредненное векторное произведение всех ребер, сходящихся в вершине. Чем больше площадь грани, тем больше будет вклад векторного произведения в результат.
Вычислять нормаль необходимо до перспективного деления, иначе направление нормали будет искажено, что приведет к неправильному определению интенсивности освещения.
Определение вектора отражения
Основная идея: по закону отражения вектор падающего света, нормаль к поверхности и вектор отражения лежат в одной плоскости, причем на этой плоскости угол падения равен углу отражения.
Существует диффузное и зеркальное отражение. При диффузном отражении свет поглощается поверхностью на которую падает и вновь излучается этой поверхностью по всем направлениям и цвет света совпадает с цветом поверхности. Блеклая, матовая.
При зеркальном отражении отраженный свет концентрируется вокруг вектора отражения, то есть это направленное отражение. Цвет зеркально отраженного света совпадает с цветом падающего света.
Учесть факт того, что происходит отражение не строго по вектору отражения а вблизи его можно возведением косинуса в степень. Чем выше степень, тем более концентрированное распределение.
Рассмотрим 4 наиболее общих способа определения вектора отражения.
- Фонг вывел решение для случая, когда свет падает вдоль оси z. Это предположение удобно использовать для модели освещения с одним точечным источником. Если начало системы координат перенести в точку поверхности, то проекция нормали и вектора отражения на плоскость xy будут лежать на одной прямой.
Обозначим угол между единичным вектором нормали и осью z через teta. Тогда составляющая вектора нормали по оси z равна cos(teta).
.
.
.
.
.
Тогда итоговые формулы для составляющих вектора отражения будут:
- Когда свет не падает по оси z или источников несколько такой метод не подходит.
Используется следующий метод. Нормаль поворачивается параллельно оси z а точка Р принимается за начало координат.
Тогда плоскость xy будет касательной к поверхности, а x-, y-составляющие векторов падения и отражения будут иметь разные знаки, а z-составляющая будет одинаковой. Далее выполняется обратное преобразование и получаются координаты вектора отражения в исходной системе координат.
- Также можно использовать векторное произведение. Равенство углов падения и отражения записывается следующим образом
4.Чисто аналитический способ.
Угол падения обозначается t, вектор R представляется суммой векторов L и n с некоторыми коэффициентами alpha beta. Далее решается система из двух уравнений и находятся эти коэффициенты
.
.
.
.
.
.
.
.
.
.
.