查找对象的阴影贴图

时间:2014-07-02 15:18:48

标签: c math 3d vector-graphics glkit

所以我有一个光源和各种各样的飞机。像这样:

    |
    |
    |
o   |
    |
    |
    |

平面由|表示,光源为o

现在我可以通过光的位置减去平面的左上角来找到方向向量(是正确的术语?),如下所示:

vec3 dir = plane_top_left - light_pos

但是,我希望能够将方向向量投影到更远的平面上,如下所示:

        | /___  I want to know where this is
       /| \
      / |
     /  |
    /   |
   /|   |
  / |   |
 /  |   |
o   |   |
    |   |
    |   |
    |   |

我怎么知道方向矢量和平面相交的位置?顺便说一下,这是一个3D场景的自上而下的视图

我在google上看了这个,并且变得非常困惑....答案很矛盾,我几乎无法理解他们背后的数学。

2 个答案:

答案 0 :(得分: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 )

答案 1 :(得分:1)

你需要一个射线平面交叉点。 如果光线定义如下(以参数形式):

r = v*t + o

v是你的目标矢量(通常是标准化的),o是射线原点,t - 参数。 目标(你的影子接收)平面是:

n*r + d = 0

n是平面的法向量。 从这个到方程你可以找到t参数​​:

t = -(n*o + d) / (n*v)

如你所知,从第一个等式中你会发现交点r。

注意:负t意味着你没有面对飞机。

相关问题