Сферический источник света для мягких теней

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

Я искал способы сгенерировать равномерное распределение случайных точек на сфере, но они кажутся немного более сложными, чем то, что я ищу. Кто-нибудь знает какие-либо методы создания этих точек на сфере? Я считаю, что мой источник света в области сферы будет просто определяться его мировыми координатами XYZ, значением цвета RGB и радиусом r.

На этот код я ссылался в Graphics Gems III, стр. 126 (это тот же метод, который обсуждался здесь и

void random_unit_vector(double v[3]) {    
double theta = random_double(2.0 * PI);
double x = random_double(2.0) - 1.0;
double s = sqrt(1.0 - x * x);
v[0] = x;
v[1] = s * cos(theta);
v[2] = s * sin(theta);

}

Это нормально, и я понимаю это, но мой сферический источник света будет в некоторой точке пространства, заданной трехмерными координатами X-Y-Z и радиусом. Я понимаю, что формула работает для единичных сфер, но я не уверен, как формула учитывает расположение сферы.

Спасибо, и я ценю помощь!


person Community    schedule 09.12.2012    source источник


Ответы (1)


Вы, кажется, путаете формулы, которые генерируют направление, то есть точку на сфере, и тот факт, что вы пытаетесь создать направление / к / сфере.

Формула, которую вы дали, выбирает случайный луч равномерно: она находит тройку X, Y, Z на единичной сфере, которую можно рассматривать как направление.

То, что вы на самом деле пытаетесь достичь, - это по-прежнему генерировать направление (точку на сфере), но которое благоприятствует определенному направлению, которое указывает на сферу (или которое ограничено конусом: конус, который вы получаете из центра вашей камеры и силуэт сферического источника света). Это можно сделать двумя способами:

  • Любая важная выборка в направлении центра вашего сферического источника света с косинусоидальным лепестком.
  • Равномерный отбор проб в конусе, определенном выше.

В первых случаях формулы приведены в «Компендиуме глобального освещения»: http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf (элемент 38, стр. 21). Во втором случае вы могли бы сделать некоторую выборку отклонения, но я Я почти уверен, что для этого есть какая-то близкая формула.

Наконец, есть последний вариант: вы можете использовать свою формулу, рассматривать полученный (X, Y, Z) как точку на вашей сцене и, таким образом, перевести его в положение вашей сферы и создать вектор, указывающий с вашей камеры. к нему. Однако это вызовет серьезные проблемы:

  • Вы будете генерировать векторы по направлению к задней части вашей сферы.
  • У вас не будет никакой формулы для PDF-файла сгенерированного набора направлений, который вам понадобится для последующей интеграции Monter Carlo.
person nbonneel    schedule 09.12.2012
comment
Спасибо, это был очень ясный ответ - думаю, я действительно запутал то, что пытался сделать. Хотя предоставленные вами ресурсы кажутся очень полезными, я подумываю использовать вместо них другой источник света, например прямоугольник. Кажется, это было бы намного проще реализовать, да? Мне просто нужно сгенерировать две случайные величины, чтобы указать точку на прямоугольнике, куда направляется луч, верно? Вы случайно не знаете какие-нибудь ресурсы для этого? Еще раз спасибо! - person ; 09.12.2012