光的反射與折射的向量計算


光的反射與折射的向量計算

      在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的時候。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM