2013-09-25 4 views
1

Я работаю над raytracer с диффузными отражениями (скажем, 64 или 128 выборок на отражение).Отклонение отражения в процентах

Например, материал может отражаться на 75%, что означает, что отраженные лучи должны отклоняться от «идеального» отражения на 25%.

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

right = cross(intersectionNormal, ray) 
up = cross(right, ray) 
ray' = (ray * w) + (up * u) + (right * v) 

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

Учитывая коэффициент отражения от 1,0 (идеальный) и 0.0 (диффузный), нормаль пересечения и идеальный луч отражения, как бы я отклонил это на процент отражения?

ответ

0

От того, что вы пытаетесь достичь, мне кажется, что «право» и «вверх» не должны зависеть от направления входящего луча, а просто образуют ортонормированный базис с нормальным. Поэтому вы бы выбрали up = cross(right, intersectionNormal).

Но вместо того, чтобы кататься самостоятельно, я бы посоветовал просто пойти с одной из стандартных моделей отражения, таких как Blinn/Phong, где экспонента делает в значительной степени то, что вы хотите, чтобы ваш показатель отражаемости делал.

+0

Проблема в том, что у меня еще нет нужного вектора. У меня есть только вектор инцидента и нормальный. Я должен создать из них правильный вектор. Что касается отражений, я уже нормально нормальный рассеянный цвет, но я хочу улучшить метод отслеживания отражения, чтобы использовать метод диффузного рассеяния (0.0 идеальное отражение -> 1.0 полностью рассеивается) для диффузных отражений при определенном количестве отсчетов на отражение (32-64 - большое количество образцов). –

+0

Вы можете выбрать «правый» вектор, какой бы вы ни хотели, он должен быть перпендикулярен нормали. Ваш 'cross (n, ray)' генерирует фиктивные результаты для поверхностей, которые вы просматриваете сверху, но это отправная точка. Но третий вектор, 'up' должен быть перпендикулярен к' right' и 'n'. Кроме того, вы нормализуете эти векторы перед использованием? – Waldheinz

+0

Я теперь использую 'norm ([Y, -X, 0])' для создания перпендикулярного вектора для 'right' и выполнения' norm (ray x right) 'для получения вектора вверх (оба произвольного), но мой математика для объединения этих трех в конечный% отклоненный вектор от «луч» не работает. Я пытаюсь использовать полярные координаты как один метод. –

Смежные вопросы