-
Notifications
You must be signed in to change notification settings - Fork 0
40.Определение нормали к поверхности и вектора отражения в алгоритмах построения реалистических изображений.
Этот вопрос чисто аналитический.
- Если поверхность задана аналитически F(x, y, z) = 0, то нормаль вычисляется через градиент в точке grad(F(x, y, z)).
- Для полигональных моделей.
Для примера возьмем усеченную пирамиду. Допустим мы работали с каркасной моделью, а потом на этот каркас натянули поверхность и решили закрасить ее. Нам нужно вычислить интенсивность, а для интенсивности нужно знать нормаль (прежде всего в вершинах мн-ков). Мы можем вычислить нормали к граням, которые инцидентны в рассматриваемой вершине. Тогда просто находим нормаль как
-
Первый способ: Т.е. если мы знаем нормаль, знаем три ее составляющие проекции коэффициентов (a,b,c) стоящие при единичных векторах (i,j,k) суммируем а1+а2+а3 - это будет коэффициент проекции на ось x (т.е. коэффициент при векторе j у итоговой нормали). Также суммируем b и c.
-
Второй способ: вычисляем нормаль, путем суммирования соответствующих векторных произведений. Мы знаем, что результатом векторного произведения является вектор (Геометрический смысл: площадь параллелограмма, построенного на этих векторах), перпендикулярный плоскости проходящий через рассматриваемые вектора.
Когда-то рез. совпадает, когда-то отличается. Отличие может быть, когда вклад одного векторного произведения существенно отличен от вклада другого векторного произведения. Исходя из геометрического свойства чем больше площадь грани, тем и больше вклад этой составляющей в общую нормаль будет больше.
Факт: человек видит какую-то поверхность, если она отражает часть падающей световой энергии и эта часть попадает в глаз человека. И еще человек может увидеть поверхность, если она пропускает световую энергию, но не целиком (часть энергии задерживается).
Пример: Чистые и грязные стекла. Если стекло чистое, то мы можем его не увидеть, а если есть грязь, то мы его замечаем.
Поэтому в графике рассматривают 2 отражения:
-
Диффузное - при диффузном отражении падающий свет поглощается поверхностью на которую он падает и затем вновь излучается (внутренними слоями) этой поверхностью по всем направлениям (равномерно) и цвет диффузно отраженного света совпадает с цветом поверхности. (если учитывать только это отражение, то поверхность будет блеклой и матовой)
-
Зеркальное - при зеркальном отражении отраженный цвет концентрируется вокруг вектора отражения, то есть это направленное отражение. Цвет зеркально отраженного света совпадает с цветом падающего света. Зеркальное отражение хорошо отображает (металлические) гладкие поверхности.
Степень концентрации отраженного света зависит от степени гладкости отражающих свойств поверхности.
Когда речь идет об нахождении вектора отражения - речь идет об отражении вектора зеркального отражения.
3 случая:
- Первый случай предусматривает, что свет распространяется вдоль оси z (L - вектором падения). Нормаль - N. Вектор отражения - R.
Нам удобно работать с единичными векторами, т.к. скалярное произведение таких векторов будет численно равно cos угла между ними (Нас как раз cos и интересует).
Вспоминая закон отражения:
1 часть: Угол образованный вектором падения (L) и вектором нормали (N) (Допусти угол Θ (тета)) равен углу образованным вектором нормали и вектором отражения (R).
2 часть: все эти вектора лежат в одной плоскости.
Если спроецировать векторы на координатную плоскость x0y , то они будут расположены на 1 прямой. Имеем два подобных прямоугольных треугольника, значит отношения проекций вектора нормали на ось x на ось y будут пропорциональны отношению проекций искомого вектора на те же оси (это одно полезное соотношение). И еще используется, что сумма квадратов проекций равна единице.
Если взять оси z. Вектор нормали с осью z образует угол Θ, а вектор отраженного света будет образовывать угол равный 2Θ. Из этого рисунка находим одну составляющую искомого вектора Rz (он совпадает с cos(2Θ)), Nz = cos(Θ).
Второе уравнение из пропорциональности сторон.
Задача выразить составляющие Rx, Ry, Rz через Nx, Ny, Nz.
Чем удобен, чем нет этот подход к опр. вектора отражения: Здесь вектор падения мы совмещаем с осью z. Если в сцене несколько источников, то нужно найти и выполнить преобразования для каждого источника (преобразования совмещающие вектор падения с осью z).
- Если в сцене несколько источников, то лучше нормаль поверхности совместить с осью z.
Если N - нормаль, то плоскость x0y является касательной к поверхности.
Далее показаны вектор падания и вектор отражения.
Rx = -Lx. Ry = -Ly, Rz=Lz
- Записываем аналитически закон отражения.
Вектора единичные, углы равны, значит и векторные произведения равны.
L*N=N*R
. Далее расписываем через определитель.
Верхняя строка единичные вектор i,j,k. Вторая строка проекции первого вектора. Третья строка проекция второго вектора. Раскрываем определитель и получаем 3 уравнения. (если векторы равны, то равны у них соответствующие проекции).
Система однородная. Из 3-ёх уравнений только 2 будут линейно независимыми. Значит одно из уравнений нужно заменить каким-то другим уравнением.
Точно также можем выразить закон отражения с помощью скалярного произведения
Скалярное произведение - сумма попарных произведений проекций. Любое из 3-ёх уравнений заменяет полученным уравнением.
- Способ чисто аналитический
Единичные вектор:
L - Вектор падания.
N - Нормаль.
R - Вектор отражения.
R - представим как сумму двух известных векторов взятых с некоторыми коэффициентами (al - альфа, b - бета (некоторые коэффициенты alpha beta), t - тета (угол падения) (Θ))
Далее cost и cot - это cos(t)
Умножим вектор сам на себя (получаем единицу) ==> мы получим единицу.
al = +/- 1 из двух корней нужно выбрать один. Из направления векторов мы должны увидеть, что al=1.