Нахождение освещенности от треугольного источника света

Поскольку большинство источников света в играх являются точечными, довольно сложно аппроксимировать площадные источники света точечными источниками. Поскольку треугольники являются универсальной формой для представления 3D-моделей (а значит, и площадных источников света), я наткнулся на задачу, заключающуюся в том, чтобы найти полную освещенность в некоторой точке 3D-пространства от однородного треугольного источника.

Итак, я начал с базовой формулы для вычисления освещенности от точечного источника:

Е "=" я потому что ( α ) р 2

где я будучи интенсивностью, α угол падения & р являющееся расстоянием от источника до точки.

Чтобы найти угол падения, нам нужно знать не только радиус-вектор точки, но и ее нормаль. Таким образом, были определены следующие векторы:

n - normal of the illuminated surface in the given point;
p - position of the point itself;
s - position of the light source;
r = s - p (distance vector).

По формулам скалярного произведения косинус угла падения рассчитывается как:

потому что ( α ) "=" н · р | н | | р | "=" н · р | р |
поскольку длина нормали равна 1.

Таким образом, формулу освещенности можно рассчитать как:

Е "=" я потому что ( α ) р 2 "=" я н · р | р | | р | 2 "=" я н · р ( р · р ) 3 / 2

Поскольку у нас есть треугольник, нам нужно найти освещенность всех точек треугольника. Любая точка с на треугольнике можно определить с помощью барицентрических координат, таким образом:

с "=" а + ( б а ) ты + ( с а ) в

где а , б & с являются вершинами и ты & в параметры в диапазоне от 0 до 1, сумма которых не может превышать 1. Таким образом:

р "=" с п "=" а + ( б а ) ты + ( с а ) в п

Наконец, я придумал двойной интеграл и застрял:

Е "=" я 0 1 ты 0 1 н · р ( р · р ) 3 / 2 д ты д в
где:
р "=" а + ( б а ) ты + ( с а ) в п

Может ли кто-нибудь проверить мое решение и помочь мне решить интеграл? (Поскольку я, честно говоря, понятия не имею, как решаются интегралы, включающие скалярные произведения.) И, возможно, для этого могут быть более простые решения? Возможно численное интегрирование, но все же хотелось бы полную формулу.

PS Задание можно немного видоизменить так, чтобы вычислять освещенность не по треугольнику, а по отрезку. Нужно просто удалить одну из вершин и в -параметр, поэтому двойной интеграл сводится к одинарному только с одной переменной.

Посмотрите в литературе по компьютерной графике. Я помню, что это или треугольник к точке, или даже, возможно, даже более сложная задача треугольника к треугольнику была решена аспирантом в Принстоне (?) и представлена ​​на SIGGRAPH. Вероятно, это было где-то в 1990-х годах. Это было частью исследования техники радиоизлучения.

Ответы (3)

Это скорее комментарий, но слишком большой.

Интенсивность от маленького кусочка треугольника пропорциональна площади этого треугольника, а также косинусу угла между нормалью к треугольнику и направлением на освещенную точку. Это потому, что если вы посмотрите на треугольник, скажем, под таким углом, что он будет выглядеть как отрезок, интенсивность будет равна нулю. Это введет дополнительный скалярный продукт в числителе и дополнительную норму р в знаменателе. Однако скалярный продукт будет постоянным, а именно | м ( а п ) | , где м является нормалью к треугольнику, потому что другие члены в р ортогональны м . Вы можете управлять знаком этого продукта, чтобы проверить, повернута ли яркая сторона источника к освещенной точке.

Также нужно учитывать, что элемент площади поверхности не равен д ты д в , скорее 2 С 0 д ты д в , где С 0 это площадь треугольника. В контексте игры удобнее вводить интенсивность (мощность) на единицу площади источника, чтобы объединить треугольники в единый однородный (или неоднородный) источник. Давайте назовем это я . Тогда, вводя обозначения

α "=" а п , β "=" б а , γ "=" с а ,
я прибываю в
Е "=" 2 С 0 я д ты д в | α м | н ( α + ты β + в γ ) ( α + ты β + в γ ) 4 ,
где область интегрирования выбрана как в вашей формуле. Мы видим, что он распадается на три интеграла, причем два из них отличаются только заменой ( ты , β ) ( в , γ ) . Итак, в принципе вам нужно знать, как вычислить следующие два интеграла:
д ты д в 1 ( α + ты β + в γ ) 4 , д ты д в ты ( α + ты β + в γ ) 4 .
Вы всегда можете повернуть и масштабировать так, чтобы α например ( 0 , 0 , 1 ) . Вы все еще можете вращаться вокруг α так что, скажем, Икс -компонент β равен 0. Таким образом, каждый интеграл на самом деле является функцией 5 переменные.

Я думаю, что получить аналитическое решение для этих интегралов действительно сложно. Если у вас все в порядке с численным интегрированием, можете попробовать, но я подозреваю, что для динамических сцен вам придется использовать довольно грубые методы, чтобы достичь достаточного количества кадров в секунду. Другой метод заключается в предварительном вычислении значений, но это, вероятно, потребует слишком много места. Еще один вариант — найти подходящую формулу для функций, но в случае с 5 переменными это довольно сложно.

Если ваша цель — статическая сцена, я бы предложил использовать ray-casting, но я думаю, что это не тот случай.

Тем не менее, я считаю, что точность не так важна в играх, и вы можете немного изменить свою модель, чтобы получить более простые формулы. Конкретная модификация, однако, зависит от масштаба длины в ваших сценах. Возможно, можно заменить 4-ю степень на 2-ю, и (вероятно) получится взять интеграл. Или, чтобы заменить 1 / Икс 4 к опыт ( с Икс 2 ) (для которых интеграл является гауссовым), для некоторых масштабов это может быть разумным и способным отразить ключевые качественные характеристики.

Для отрезка прямой интеграл легко модифицируется. Я не пытался взять его, но даже если это невозможно, это по существу функция двух переменных, и вы можете довольно легко подогнать числовые данные к простой формуле.

Премного благодарен за ваш вклад. Я не уверен, имеет ли значение ориентация треугольника относительно точки, поскольку я считаю любую точку треугольника бесконечно малым источником света, излучающим лучи во всех направлениях. Однако вы правы в отношении включения области (сначала я рассматривал треугольник как нечто вроде точечного источника света, но большего размера), поскольку это устраняет все проблемы, связанные с однородностью.
Я пытался решить интеграл, избавившись от скалярных произведений и преобразовав подынтегральное выражение в полиномиальную форму, но кажется, что даже Wolfram Alpha не может решить такие вещи, что приводит к «превышению времени вычислений». Мне еще удалось получить решение для отрезка прямой (ниже).
@inker, да наверное дополнительный косинус не имеет значения

Что касается сегмента линии, я использовал замены, предложенные Питером:

α "=" а п
β "=" б а
р "=" а + ( б а ) ты п "=" α + β ты
р р "=" α α + 2 ( α β ) ты + ( β β ) ты 2

Можно ввести некоторые дополнительные константы:

А "=" α α
Б "=" α β
С "=" β β
М "=" н α
п "=" н β

Таким образом:

я 0 1 н р ( р р ) 3 / 2 д ты "=" я 0 1 н α + ( н β ) ты ( α α + 2 ( α β ) ты + ( β β ) ты 2 ) 3 / 2 д ты "="
"=" я 0 1 М + п ты ( А + 2 Б ты + С ты 2 ) 3 / 2 д ты "=" я А п Б М + Б п ты С М ты ( Б 2 А С ) А + 2 Б ты + С ты 2 | 0 1 "="
"=" я ( А п Б М + Б п С М ( Б 2 А С ) А + 2 Б + С А п Б М ( Б 2 А С ) А )

Введение дополнительных констант:

Вопрос "=" А п Б М
Т "=" Б 2 А С

Таким образом:

Е "=" я ( Вопрос + Б п С М Т А + 2 Б + С Вопрос Т А )

У вас есть р р неправильный: р р "=" α α + 2 α β ты + β β ты 2

Треугольники, как правило, очень плохи для получения аналитического решения при интегрировании по ним — гораздо хуже, чем можно было бы предположить на основе простого обдумывания вопроса . Это похоже на проблему с бесконечной сеткой резисторов в электротехнике: вы начинаете с "не могли бы вы не просто... но что, если бы мы... конечно, если бы мы установили...", а затем до вас начинает доходить, как тяжело это!