Найти отображение тени для объекта

#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 означает, что вы не обращены к плоскости.