光的反射与折射的向量计算

光的反射与折射的向量计算

      在raytrace的计算中,光反射与折射的计算是两个非常重要的过程,而由于我们在图形学中通常都使用向量来计算,所以也有必要找到一套计算光反射和折射模型的向量计算方法。(该方法来自Bram de Greve的文章"Reflections and Refractions in Ray Tracing")

1.反射,假设入射光的单位方向向量为L,物体的单位表面法向量为N,最后要求的反射单位向量为R,如图所示

由于这几个向量都是单位向量,我们很容易看出R-L的结果(R加上-L(绿色的那根))与N是共线的(同方向),而且|R-L|的值等于2乘以L在N上的投影(即蓝色的那段)。于是得到等式R-L=N*(2N·(-L)),求解得到:

R=L-2(N·L)*N。

 

2.折射,折射的计算要比反射复杂多了,首先要知道折射定律,入射角θ1与折射角θ2满足sinθ1/sinθ2=η2/η1,其中η1,η2分别为入射光与折射光所在空间的介质的折射率,可以取η=η2/η1为相对折射率,而我们知道的已知量是N(物体表面单位法向量),L(光的入射单位向量),η(相对折射率),下面就来求解单位折射向量T。

首先要注意N,L,T都是单位向量,这一点很重要!

我们需要求出cosθ1与cosθ2,cosθ1非常好求,实际上cosθ1=-N·L(因为N,L,T都是单位向量,所以可以这样写)。cosθ2=sqrt(1-sin²θ2)=sqrt(1-(1/η²)sin²θ1)=sqrt(1-(1/η²)(1-cos²θ1))

(注释:sqrt是开方的意思)

下面将L和T分别分解到N的方向和垂直于N的方向,L=l1+l2,T=t1+t2。注意到|l1|=|L|sinθ1=sinθ1,同理得|t1|=|T|sinθ2,而容易知道向量l1与t1的方向是一致的,所以有t1=(sinθ2/sinθ1)*l1=(1/η)*l1

再根据l2=-Ncosθ1(因为l2与N方向相反,大小关系是|l2|=|N|cosθ1)以及L=l1+l2,

可以求得l1=L+Ncosθ1。将这个结果带入到上面红色的等式中,t1=(1/η)(L+cosθ1)。

下面还需要求出t2,由勾股定理可以得到|t1|²+|t2|²=|T|²=1,然后再次利用t2与N的方向相反的关系得出:

t2=-N*|t2|²=-sqrt(1-|t1|²)*N,之前已经知道|t1|=sinθ2(紫色的式子),所以带入前面的式子可知

t2=-Ncosθ2。

最后T=t1+t2=(1/η)(L+Ncosθ1)-Ncosθ2=L/η+((cosθ1)/η-cosθ2)*N。其中cosθ1与cosθ2由上面的两个蓝色式子给出。

 

同时应该注意到由于在不同的情况下η的值是不同的,再配合上入射角θ1取值,完全可以让1-(1/η²)(1-cos²θ1)的值小于0,这样上面蓝色等式中的cosθ2岂不是就无意义了?

而事实上,这正是全反射现象。当光线从光密介质进入光疏介质的时候,如果入射角大于某个临界角时,会发生全反射现象。这个临界角就是是折射角为90度时对应的入射角,也就是cosθ2刚好等于0的时候。

posted @ 2012-11-05 13:37  星光下的守望者  阅读(7888)  评论(0编辑  收藏  举报