光线反射是一个非常重要的概念,或者说常识,这里我们来聊一下真实世界。
现实世界中,我们眼睛之所以看到各种各样的物体,其原因就是太阳发出的光线照射到地球上,然后经过反射后进入人的眼睛,人的眼睛接收到光子后在视网膜上成像,然后通过生物信号传递给大脑,所以人就看到了这个世界。
这里我们把太阳叫做“光源”,其实我们也有很多人造“光源”,比如电灯,激光等。比如在一间黑暗的屋子,我们打开屋里唯一一盏电灯,瞬间屋子就被照亮,我们的眼睛就能看到屋里的物体。
ps:这里我们思考一个现象:我们正午站在一片操场上,四目远眺,会发现眼睛能一览无遗操场的各个角落,给人的感觉就是操场四面八方的明亮程度都是一样的。
但是我们在黑暗的屋子里,就算是打开电灯,举目四望,也会发现屋子里有明有暗,而且是距离电灯越近的越亮,越远的越暗。
这种现象是为什么呢?
因为太阳首先是一个超大的发光发热的内部进行着剧烈核聚变的恒星,他发出来的强烈光线到达地球都要八分钟,可见这是一个非常遥远的距离,在这种距离的尺度上,太阳的光线就是无限接近于平行“辐射”过地球一半的表面。
而黑屋中的一盏灯,光线从那个“小点”四面八方发射出来,因为功率低,光强度低,所以离灯光稍微远一些的地方就照的不太亮了。
图形学中,定义这两种“光源”,第一种就是平行光,第二种就是点光源。这里我们只是随意的聊一下,让我们有个直观的想象。
接下来我们进入细分讲解了,积少成多这点我们都知道,就算是大到太阳,小到电灯,他们的“光照”效果都是通过发射“一根一根”乃至“无数根”光线进行作用的。
ps:在物理上光是具有波粒二象性的,并不是“一根”光线,但是在图形学角度,我们就认为光线就是“一根”的
这里我们只讨论“一根”光线的行为。
光线照射在物体上的反射也分为镜面反射和漫反射,打个形象的比喻就是,光线射入比较光滑的平面而反射就是镜面反射,比如镜子。而光线射入比较粗糙的表面进行的乱七八糟的反射(或者说散射)就叫漫反射,比如地面,其实这两种反射有个本质上的相同点,就是遵循光的反射定律。
物理学家通过观察自然现象,发现一个光的反射定律:假如一根光线从一端射入“理想镜面”,反射光线从另一端射出,那么入射光线和反射光线就会分居在“入射点”为起点的“理想镜面”的法向量N的两侧,而且,入射光线和反射光线分别于法向量N的夹角相等,小伙伴们可以想象一下打台球,白球撞击桌沿的反弹。
其实漫反射之所以“乱七八糟”,是因为漫反射的平面“凹凸不平”,但是“一根”光线照射在“粗糙平面”上,其实他进行反射的那一个点所在的平面也可以看作一个很“微小的理想镜面”。
这样就引来这篇的核心问题了,到底反射向量如何计算。
假设我们有一个发着光的太阳,太阳底下有一个“理想镜面”,如下图:
这时候我们抽象成数学图来进行反射光的计算,如下图:
这幅图可以看出,我们计算反射光线OB,则转换成了计算OP,这里OP是AO在法向量N上的投影,接下来我们推导投影向量计算,如下图:
我们根据点积计算出cosθ,然后通过OA' = |OA|*cosθ*单位法向量n就能得到,向量的投影公式。
这个时候我们再回过来推导 OB = AO + 2OP的结果,如下图:
从next:开始,我们就求出了OB = AO - 2(AO·N)·N(ps:第一个AO·N的点积计算出标量m再乘N,为了不引起误解,这里提示一下)。
这里AO的向量就等于入射点到光源的向量,N就是平面的单位法向量。
这两个量应该好求,AO就是入射点坐标-光源坐标,N就是求平面的法向量(之前有通过叉积推导)再进行单位化。
讲到这里了,基本上概念和公式推导都有了,接下来我们就来写一个模拟程序来看看效果,如下图:
上面我们形象的模拟了光线反射的路径。
demo下载地址:https://download.csdn.net/download/yinhun2012/10273595