Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找对象的阴影映射_C_Math_3d_Vector Graphics_Glkit - Fatal编程技术网

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表示您没有面对平面