2009-02-20 2 views
4

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

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

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

Благодаря

ответ

8

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

+0

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

0

Звучит так, как будто вы пытаетесь рассчитать диффузное освещение. Предполагая, что у вас есть Surface Point http://www.yourequations.com/eq.latex?%5Cinline%20%5Coverrightarrow%7Bp_o%7D точка на поверхности, Light Position http://www.yourequations.com/eq.latex?%5Cinline%20%5Coverrightarrow%7Bp_L%7D, и нормальный вектор Normal Vector http://www.yourequations.com/eq.latex?%5Cinline%20%5Coverrightarrow%7Bn%7D. Вы можете рассчитать рассеянное освещение, как это:

Diffuse Illumination 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

Вы технически не нужно вычислить фактический угол инцидента, потому что вам нужно только косинус той, которую dot product удобно дает вам.

+0

Хороший набор для уравнений, Кевин. Что вы использовали для этого? – duffymo

+0

Похоже, он использовал http://yourequations.com, опрятный сайт. –

+1

http://www.yourequations.com/ Я ждал вопроса, который я мог бы использовать. –

0

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

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

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

Определите alt text http://www.yourequations.com/eq.latex?p_0 как ваш глазный пункт.

Определите alt text http://www.yourequations.com/eq.latex?p_1 как точку удара вашего «луча глазного яблока» на полигоне.

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

alt text 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

Итак, вы создали вектор, указывающий от alt text http://www.yourequations.com/eq.latex?p_1 к alt text http://www.yourequations.com/eq.latex?p_0, а затем разделить этот вектор по своей длине, что дает вам вектор длины 1, что указывает от alt text http://www.yourequations.com/eq.latex?p_1 в alt text 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 text http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D, который вы только что создали.Другим словом для теты является угол падения.

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

alt text 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

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

alt text http://www.yourequations.com/eq.latex?%5Ctheta%20=%20%5Carccos%28%5Chat%7Bn%7D%20%5Ccdot%20%5Chat%7Bv%7D%29

Edit: модифицирована выше, чтобы добавить yourequations.com форматирование.