#c #math #3d #vector-graphics #glkit
#c #математика #3D #векторная графика #glkit
Вопрос:
Итак, у меня есть источник света и своего рода плоскость. Вот так:
|
|
|
o |
|
|
|
Плоскость представлена |
, а источник света — o
Теперь я могу найти вектор направления (это правильный термин?) путем вычитания верхнего левого угла плоскости по положению источника света, вот так:
vec3 dir = plane_top_left - light_pos
Однако я хочу иметь возможность проецировать вектор направления на более дальнюю плоскость, вот так:
| /___ I want to know where this is
/|
/ |
/ |
/ |
/| |
/ | |
/ | |
o | |
| |
| |
| |
Как я узнаю, где вектор направления и плоскость пересекаются? Кстати, это вид 3D-сцены сверху вниз
Я просмотрел это в Google и пришел в крайнее замешательство …. ответы были противоречивыми, и я едва могу понять математику, стоящую за ними.
Ответ №1:
Я не думаю, что это имеет какое-либо отношение к C
конкретно…
Вот что я могу предложить с моими знаниями геометрии пространства: как вы сказали, вектор направления, не являющийся единицей, будет получен путем вычитания координат начальной точки из целевой точки. Давайте обозначим верхний левый угол вашей плоскости TLC
, а источник света — LS
. Тогда вектор направления, не являющийся единицей, будет:
( TLC - LS )
В трехмерной системе это было бы эквивалентно:
< TLC_X - LS_X,
TLC_Y - LS_Y,
TLC_Z - LS_Z >
Ответ на ваш вопрос зависит от того, насколько далеко находится плоскость, на которую вы хотите спроецировать свет. Если оно в 7/3
раз больше исходной плоскости, чем на вашей диаграмме, то вы могли бы просто умножить вектор направления на этот коэффициент и добавить его к LS
:
LS ( TLC - LS ) * 7 / 3
Что бы вы ни делали, вам придется добавить это в LS
, поскольку это точка происхождения света. В зависимости от того, как далеко находится проецируемая плоскость, коэффициент умножения будет меняться. В общем, это будет:
LS ( TLC - LS ) * ( how_far_the_projected_plane_is / how_far_the_original_plane_is )
Ответ №2:
Вам нужно пересечение лучей с плоскостью. Если луч определен следующим образом (в параметрической форме):
r = v*t o
v — ваш вектор направления (обычно нормализованный), o — начало луча, t — параметр.
И целевая плоскость (принимающая вашу тень) равна:
n*r d = 0
n — вектор нормали к плоскости.
Из этого в уравнениях вы можете найти t-параметр:
t = -(n*o d) / (n*v)
И, как вы теперь знаете, из первого уравнения вы найдете точку пересечения r.
Примечание: отрицательное t означает, что вы не обращены к плоскости.