Лучевая трассировка освещения

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

Я пытаюсь использовать следующее для обновления освещения, но сгенерированное изображение выглядит точно так же, поэтому я знаю, что делаю что-то не так. Я предполагаю, что я путаю векторы в некотором роде. Хит - это сфера, которая была поражена, а 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);
Другие вопросы по тегам