2016-03-15 3 views
0

Я работаю над лучей для сфер, и я пытаюсь реализовать осветительную функцию для расчета интенсивности света на луч. В настоящее время я застрял на расчете диффузного отражения:Поиск нормалей сферы в Ray Tracer Porgram

Учитывая луч R, сфера S, точка P, где R пересекает S, и источник света L

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

Я знаю, что могу получить вектор направления света, вычисляя L - P. Я сейчас зацикливаюсь на вычислении нормы.

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

+0

Я думаю, что его направление света = нормализованное (L - P) и нормальное нормализуется (P - центр S); –

+0

P - центр S - нормальная поверхность в P. Направление света - это положение L - P. Из какого источника вы учитесь? – molbdnilo

+0

Не могли бы вы объяснить, для чего эта матрица преобразования S? Для вас? – Guiroux

ответ

1

Как указано в ответе на ваш другой вопрос, использование обратного к шаровой матрице будет перемещать объекты, трансформированные им в сферное пространство (где сфера находится в начале координат [0,0,0]).

Чтобы вычислить нормаль вам превратить ваш свет позиции в сфере пространства с помощью S⁻¹, если вы не используете anisotropic scalings вы можете просто нормализовать преобразованный свет положение, чтобы получить нормальное:

transform light position by inverted scaling matrix

normalize transformed light position

В противном случае вам нужно будет преобразовать transformed light position с использованием матрицы инвертированного масштабирования.

Я заметил, что некоторые люди взяли нормальный вычисленный из Р - центр S

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

и умножить его на обратную матрицу шкалы сферы в квадрате так: normalize (inv (S.scale) * inv (S.scale) * (P - центр S)).

В квадратике инверсия делает агностик масштабирования своим знаком, например. когда сфера масштабируется равномерно на -1, рассчитанная нормаль будет такой же, как если бы не было масштабирования. Когда не, построив матрицу масштабирования, отрицательное масштабирование приведет к тому, что нормальная направленность в противоположном направлении и (при надлежащих условиях освещения) будет похожа на внутреннюю поверхность сферы (-секунда).

+0

Я заметил, что некоторые люди вывели нормаль, рассчитанную из P-центра S, и умножили ее на обратную матрицу шкалы сферы, квадратную так: normalize (inv (S.scale) * inv (S.scale) * (P - центр S)). И они устанавливают результат как новый нормальный вектор. Вы знаете, почему это так? Особенно с двумя умножениями обратной матрицы. –

+0

@ChangLiu Я расширил свой ответ, чтобы принять во внимание ваш комментарий –