C 查找对象的阴影映射
所以我有一个光源,还有一个飞机。像这样:C 查找对象的阴影映射,c,math,3d,vector-graphics,glkit,C,Math,3d,Vector Graphics,Glkit,所以我有一个光源,还有一个飞机。像这样: | | | o | | | | 平面由|表示,光源为o 现在我可以通过用光的位置减去平面的左上角来找到方向向量(这是右项吗?),如下所示: vec3 dir = plane_top_left - light_pos | /___ I want to know where this is /| \ / | / | / | /|
|
|
|
o |
|
|
|
平面由|
表示,光源为o
现在我可以通过用光的位置减去平面的左上角来找到方向向量(这是右项吗?),如下所示:
vec3 dir = plane_top_left - light_pos
| /___ I want to know where this is
/| \
/ |
/ |
/ |
/| |
/ | |
/ | |
o | |
| |
| |
| |
但是,我希望能够将方向向量投影到更远的平面上,如下所示:
vec3 dir = plane_top_left - light_pos
| /___ I want to know where this is
/| \
/ |
/ |
/ |
/| |
/ | |
/ | |
o | |
| |
| |
| |
我怎么知道方向向量和平面在哪里相交?顺便说一下,这是3D场景的自顶向下视图
我在谷歌上查到了这一点,感到非常困惑。。。。答案相互矛盾,我几乎无法理解它们背后的数学原理。我认为这与
C
没有任何关系
这是我用空间几何知识所能提供的:正如你所说的,非单位方向向量将通过从目标点减去初始点的坐标得到。让我们用TLC
表示平面的左上角,用LS
表示光源。然后,非单位方向向量为:
( TLC - LS )
在三维系统中,这相当于:
< TLC_X - LS_X,
TLC_Y - LS_Y,
TLC_Z - LS_Z >
无论您做什么,都必须将其添加到LS
,因为它是灯光的原点。根据投影平面的距离,乘法因子将发生变化。一般来说,它将是:
LS + ( TLC - LS ) * ( how_far_the_projected_plane_is / how_far_the_original_plane_is )
需要一个光线平面交点。 如果光线定义如下(以参数形式): v是dir向量(通常规格化),o是射线原点,t参数。 目标(您的阴影接收)平面为:
n*r + d = 0
n是平面的法向量。
从这个方程可以找到t参数:
t = -(n*o + d) / (n*v)
正如你现在知道的,从第一个方程,你会找到交点
注:负t表示您没有面对平面