Поскольку большинство источников света в играх являются точечными, довольно сложно аппроксимировать площадные источники света точечными источниками. Поскольку треугольники являются универсальной формой для представления 3D-моделей (а значит, и площадных источников света), я наткнулся на задачу, заключающуюся в том, чтобы найти полную освещенность в некоторой точке 3D-пространства от однородного треугольного источника.
Итак, я начал с базовой формулы для вычисления освещенности от точечного источника:
где будучи интенсивностью, угол падения & являющееся расстоянием от источника до точки.
Чтобы найти угол падения, нам нужно знать не только радиус-вектор точки, но и ее нормаль. Таким образом, были определены следующие векторы:
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).
По формулам скалярного произведения косинус угла падения рассчитывается как:
Таким образом, формулу освещенности можно рассчитать как:
Поскольку у нас есть треугольник, нам нужно найти освещенность всех точек треугольника. Любая точка на треугольнике можно определить с помощью барицентрических координат, таким образом:
где , & являются вершинами и & параметры в диапазоне от 0 до 1, сумма которых не может превышать 1. Таким образом:
Наконец, я придумал двойной интеграл и застрял:
Может ли кто-нибудь проверить мое решение и помочь мне решить интеграл? (Поскольку я, честно говоря, понятия не имею, как решаются интегралы, включающие скалярные произведения.) И, возможно, для этого могут быть более простые решения? Возможно численное интегрирование, но все же хотелось бы полную формулу.
PS Задание можно немного видоизменить так, чтобы вычислять освещенность не по треугольнику, а по отрезку. Нужно просто удалить одну из вершин и -параметр, поэтому двойной интеграл сводится к одинарному только с одной переменной.
Это скорее комментарий, но слишком большой.
Интенсивность от маленького кусочка треугольника пропорциональна площади этого треугольника, а также косинусу угла между нормалью к треугольнику и направлением на освещенную точку. Это потому, что если вы посмотрите на треугольник, скажем, под таким углом, что он будет выглядеть как отрезок, интенсивность будет равна нулю. Это введет дополнительный скалярный продукт в числителе и дополнительную норму в знаменателе. Однако скалярный продукт будет постоянным, а именно , где является нормалью к треугольнику, потому что другие члены в ортогональны . Вы можете управлять знаком этого продукта, чтобы проверить, повернута ли яркая сторона источника к освещенной точке.
Также нужно учитывать, что элемент площади поверхности не равен , скорее , где это площадь треугольника. В контексте игры удобнее вводить интенсивность (мощность) на единицу площади источника, чтобы объединить треугольники в единый однородный (или неоднородный) источник. Давайте назовем это . Тогда, вводя обозначения
Я думаю, что получить аналитическое решение для этих интегралов действительно сложно. Если у вас все в порядке с численным интегрированием, можете попробовать, но я подозреваю, что для динамических сцен вам придется использовать довольно грубые методы, чтобы достичь достаточного количества кадров в секунду. Другой метод заключается в предварительном вычислении значений, но это, вероятно, потребует слишком много места. Еще один вариант — найти подходящую формулу для функций, но в случае с 5 переменными это довольно сложно.
Если ваша цель — статическая сцена, я бы предложил использовать ray-casting, но я думаю, что это не тот случай.
Тем не менее, я считаю, что точность не так важна в играх, и вы можете немного изменить свою модель, чтобы получить более простые формулы. Конкретная модификация, однако, зависит от масштаба длины в ваших сценах. Возможно, можно заменить 4-ю степень на 2-ю, и (вероятно) получится взять интеграл. Или, чтобы заменить к (для которых интеграл является гауссовым), для некоторых масштабов это может быть разумным и способным отразить ключевые качественные характеристики.
Для отрезка прямой интеграл легко модифицируется. Я не пытался взять его, но даже если это невозможно, это по существу функция двух переменных, и вы можете довольно легко подогнать числовые данные к простой формуле.
Что касается сегмента линии, я использовал замены, предложенные Питером:
Можно ввести некоторые дополнительные константы:
Таким образом:
Введение дополнительных констант:
Таким образом:
Треугольники, как правило, очень плохи для получения аналитического решения при интегрировании по ним — гораздо хуже, чем можно было бы предположить на основе простого обдумывания вопроса . Это похоже на проблему с бесконечной сеткой резисторов в электротехнике: вы начинаете с "не могли бы вы не просто... но что, если бы мы... конечно, если бы мы установили...", а затем до вас начинает доходить, как тяжело это!
Олин Латроп