Лучевая трассировка освещения
Я пытаюсь реализовать зеркальное и рассеянное освещение для простого приложения трассировки сферных лучей, но у меня проблемы с векторами.
Я пытаюсь использовать следующее для обновления освещения, но сгенерированное изображение выглядит точно так же, поэтому я знаю, что делаю что-то не так. Я предполагаю, что я путаю векторы в некотором роде. Хит - это сфера, которая была поражена, а mindis - это расстояние до этой точки. Pir, Pig, Pib - это RGB для цвета.
P3D intersection = ray.position.add(ray.direction).scale(mindis);
P3D l = intersection.sub(light).normalize();
P3D n = hit.center.sub(intersection).normalize();
double dot = l.dot(n);
P3D f = l.add(n).scale(-2.0 * dot);
double dot2 = f.dot(ray.direction);
pir += dot2 * 20;
pig += dot2 * 20;
pib += dot2 * 20;
1 ответ
Возможно, первая строка должна быть:
P3D intersection = ray.position.add(ray.direction.scale(mindis));
Также
P3D f = l.add(n.scale(-2.0 * dot));
Кажется, что f - это направление, в котором свет отражается от сферы. Как правило, это будет противоположное направление луча, так что вы, вероятно, хотите
double dot2 = -f.dot(ray.direction);