All,
Я пишу довольно нетрадиционный трассировщик лучей для расчета свойств теплопередачи различных объектов в сцене.В этом трассировщике лучей случайные лучи снимаются с поверхности моих примитивных объектов в сцену для проверки пересечений.
Этот конкретный алгоритм требует, чтобы каждый луч развивался в примитивном пространстве, затем аффинно преобразовывался исходным объектом в мировое пространство, а затем аффинно преобразовывался обратно в примитивное пространство других объектов в сцене для проверки на пересечение.
Все хорошо, пока я не сделаю анизотропную шкалу, например, масштабирую объект по [2 2 1] (изотропная шкала в порядке).Это наводит меня на мысль, что я неправильно преобразовываю направленную составляющую луча.В настоящее время я преобразую направление луча из примитивного пространства в мировое пространство путем умножения направленного компонента на транспонирование матрицы обратного преобразования исходных объектов, а затем преобразую луч из мирового пространства в каждое примитивное пространство путем умножения на транспонирование преобразования целевых объектов.matrix.
Я также пытался умножить на матрицу преобразования исходного примитива, чтобы перейти от примитива к мировому пространству, и умножить на обратное преобразование мест назначения, чтобы перейти от мирового пространства к примитивному пространству, но это оказалось неудачным.
Я полагаю, что луч, испускаемый с поверхности примитивного объекта (в случайной точке и в произвольном направлении), должен быть преобразован так же, как нормаль поверхности при «регулярном» отслеживании лучей, однако я не уверен.
Кто-нибудь из экспертов знает, в чем заключается недостаток моей методологии?Не стесняйтесь спрашивать, требуется ли дополнительная информация.
Основной алгоритм для этого трассировщика лучей следующий:
For each object, i, in scene
{
for each ray, r, in number of rays per object
{
determine random ray from primitive i
convert ray from primitive space of i to world space
for each object, j, in scene
{
convert ray to primitive space of object j
check for intersection with object j
}
}
}
Надеюсь, чтобы прояснить вопрос, давайте рассмотрим пример,Предположим, у меня есть цилиндр, вытянутый вдоль оси z (единичный радиус и высота), и кольцо, лежащее в плоскости xy с внутренним диаметром 7 и внешним диаметром 8. Я хочу масштабировать цилиндр в 6 раз по x и yнаправления (но не направление z), поэтому моя аффинная матрица преобразования выглядит следующим образом:
M(cylinder) = |2 0 0 0| M^-1(cylinder) = | .5 0. 0. 0. |
|0 2 0 0| | 0. .5 0. 0. |
|0 0 1 0| | 0. 0. 1. 0. |
|0 0 0 1| | 0. 0. 0. 1. |
M(annulus) = |1 0 0 0| M^-1(annulus) = |1 0 0 0|
|0 1 0 0| |0 1 0 0|
|0 0 1 0| |0 0 1 0|
|0 0 0 1| |0 0 0 1|
Теперь предположим, что у меня есть луч, который имеет случайную начальную точку на поверхности цилиндра s и случайное направление отсюдаот поверхности цилиндра c, дающей луч r (os) = s + ct.
Я хочу преобразовать этот луч из примитивного (объектного) пространства в мировое пространство, а затем проверить на пересечение с другими объектами всцена (кольцо).
Первый вопрос: как правильно преобразовать луч r (os) в мировое пространство r (ws), используя M (цилиндр) или M ^ -1 (цилиндр).
Второй вопрос: как правильно преобразовать луч r (ws) из мирового пространства в пространство объекта, чтобы проверить его на предмет пересечения с другим объектом?действует с помощью M (кольцевое пространство) и M ^ -1 (кольцевое пространство).
Некоторая дополнительная справочная информация:
Это приложение для расчета радиационного теплообмена между N объектами.Луч запускается из случайной точки на объекте, причем его направление выбирается случайным образом в пределах полусферического распределения, ориентированного по нормали поверхности в случайной точке.
Вот некоторая визуализация моей проблемы.Направленное распределение лучей при его первом генерировании:
Если применить преобразование к мировым координатам с использованием матрицы преобразования M:
Если применить преобразование кмировые координаты с использованием матрицы обратного преобразования M ^ -1