所以我有一个光源和各种各样的飞机。像这样:
|
|
|
o |
|
|
|
平面由|
表示,光源为o
现在我可以通过光的位置减去平面的左上角来找到方向向量(是正确的术语?),如下所示:
vec3 dir = plane_top_left - light_pos
但是,我希望能够将方向向量投影到更远的平面上,如下所示:
| /___ I want to know where this is
/| \
/ |
/ |
/ |
/| |
/ | |
/ | |
o | |
| |
| |
| |
我怎么知道方向矢量和平面相交的位置?顺便说一下,这是一个3D场景的自上而下的视图
我在google上看了这个,并且变得非常困惑....答案很矛盾,我几乎无法理解他们背后的数学。
答案 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意味着你没有面对飞机。