Как вы рассчитываете угол падения? - PullRequest
4 голосов
/ 20 февраля 2009

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

У меня возникли проблемы с тем, чтобы обернуть голову вокруг более продвинутой математики в аспектах освещения вещей. По сути, у меня есть точка для моего света. Предполагая, что спад расстояния не произойдет, я смогу использовать точку на многоугольнике, которую я нашел, и сравнить нормаль в этой точке с углом падения света, чтобы определить значение освещенности. Итак, учитывая точку на плоскости, нормаль для этой плоскости и точечный источник света, как бы я смог выяснить этот угол?

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 20 февраля 2009

Точечное произведение вектора нормали к поверхности и вектора падающего света даст вам косинус угла падения, если вы нормализовали свои векторы.

0 голосов
/ 20 февраля 2009

ПРИМЕЧАНИЕ. С того места, где я сейчас сижу, я не могу загрузить фотографию для вас. Я постараюсь изложить это для вас словами.

Вот как вы можете представить этот процесс:

Определите альтернативный текст http://www.yourequations.com/eq.latex?%5Chat%7Bn%7D как нормализованную нормаль (вертикальный вектор, который выходит из вашего плоского многоугольника и имеет единицу длины, что упрощает математику).

Определите альтернативный текст http://www.yourequations.com/eq.latex?p_0 как точку вашего глазного яблока.

Определите альтернативный текст http://www.yourequations.com/eq.latex?p_1 как точку удара вашего "луча глазного яблока" на многоугольник.

Определите альтернативный текст http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D как нормализованный вектор, указывающий от альтернативный текст http://www.yourequations.com/eq.latex?p_1 обратно на альтернативный текст http://www.yourequations.com/eq.latex?p_0. Вы можете написать это так:

альтернативный текст http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D%20=%20%5Cfrac%7B%5Coverrightarrow%7B(p_0%20-%20p_1)%7D%7D%7B||p_0%20-%20p_1||%7D

Итак, вы создали вектор, который указывает от альтернативный текст http://www.yourequations.com/eq.latex?p_1 до альтернативный текст http://www.yourequations.com/eq.latex?p_0, а затем разделил этот вектор на его собственную длину, давая вам вектор длины 1, который указывает на альтернативный текст http://www.yourequations.com/eq.latex?p_1 до альтернативный текст http://www.yourequations.com/eq.latex?p_0

Причина, по которой мы пошли на эту неприятность, заключается в том, что нам бы очень хотелось, чтобы угол alt text http://www.yourequations.com/eq.latex?%5Ctheta представлял собой угол между нормальным alt text http://www.yourequations.com/eq.latex?%5Chat%7Bn%7D и этим вектором alt текст http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D, который вы только что создали. Другое слово для тета - угол падения .

Простой способ рассчитать этот угол падения - это использовать точечное произведение . Используя термины, определенные выше, вы берете компоненты x, y и z каждого из этих векторов единичной длины, умножаете их вместе и складываете суммы, чтобы получить скалярное произведение.

альтернативный текст http://www.yourequations.com/eq.latex?%5Chat%7Bn%7D%20%5Ccdot%20%5Chat%7Bv%7D%20=%20%5Ccos%7B%5Ctheta%7D%20=%20n_x%20%20v_x%20+%20n_y%20%20v_y%20+%20n_z%20%20v_z

Для вычисления альтернативного текста http://www.yourequations.com/eq.latex?%5Ctheta,, поэтому вы просто используете обратный косинус на точечном произведении:

альтернативный текст http://www.yourequations.com/eq.latex?%5Ctheta%20=%20%5Carccos%28%5Chat%7Bn%7D%20%5Ccdot%20%5Chat%7Bv%7D%29

Редактировать: изменилось выше, чтобы добавить yourequations.com форматирование.

0 голосов
/ 20 февраля 2009

Мне кажется, что вы пытаетесь рассчитать рассеянное освещение. Предполагая, что у вас есть Точка поверхности http://www.yourequations.com/eq.latex?%5Cinline%20%5Coverrightarrow%7Bp_o%7D точка на поверхности, Положение света http://www.yourequations.com/eq.latex?%5Cinline%20%5Coverrightarrow%7Bp_L%7D, и Нормальный вектор http://www.yourequations.com/eq.latex?%5Cinline%20%5Coverrightarrow%7Bn%7D нормальный вектор. Вы можете рассчитать рассеянное освещение следующим образом:

Рассеянное освещение http://www.yourequations.com/eq.latex?%5Coverrightarrow%7BL%7D%3D%5Coverrightarrow%7Bp_L%7D-%5Coverrightarrow%7Bp_o%7D%5C%5C%0AI_d%3Dk%2a%5Cfrac%7B%5Coverrightarrow%7BL%7D%5Ccdot%5Coverrightarrow%7Bn%7D%7D%7B%5C%7C%5Coverrightarrow%7BL%7D%5C%7C%2a%5C%7C%5Coverrightarrow%7Bn%7D%5C%7C%7D

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

...