其實光線除了反射現象外,還有折射現象,打個比方,你看水塘中魚兒游動,表面上看起來魚兒很貼近水面,同時也感覺水底很淺,結果一腳捅下去,直接沒到大腿了,這就是光的折射產生的一種視覺欺騙。
光線折射的產生,其實是因為光線通過不同介質所產生的「偏折」現象。
ps:光線的「偏折」現象實際上和光的粒子性有關,這裡我隨便聊一下,光的波粒二象性說明光子也是粒子,光子的吸收與發出遵守粒子的機率布,光的運動路線,也就是光子吸收、發出的最大機率的地方,當然物理學中也認可光是機率波,
由於光的運動路線是光子被吸收,發出的最大機率的地方,那麼光線的方向,就會向著吸收、發出光的可能性多的前進,也就是那個方向吸收這種光子的可能性大,就向這個方向偏折,我們假設光子在真空中,單位時間內被吸收、發出了n次,而在介質中,在相同的時間內被吸收、發出了m次,光子本身的速度不變,由於被吸收發出,運動路程減少,速度減小,那麼,則,當光線以角入射到介面上的時候,由於光子的法線方向吸收光子、發出光子的可能性大,光線應該向著法線方向偏折。
回到正題,這裡我們是來學習圖形學的,我們暫時只來討論光的折射:
光從一種介質斜射入另一種介質時,傳播方向發生改變,從而使光線在不同介質的交界處發生偏折
。這裡來繪畫一幅圖看一下上面水塘的現象,如下圖:
眼睛欺騙了我們,讓我們把虛擬魚的座標當成了真實魚的座標。
計算機圖形學中,我們利用斯涅爾定律表示折射:
斯涅爾定律是描述光或其他的波,從乙個介質進入另一介質,入射角與折射角關係的乙個公式,此定律得到入射角的正弦值與折射角的正弦值的比值為一定值,而此一定值跟入射與折射介質有關。
公式也簡單:n1 * sinθ1 = n2 * sinθ2,
其中n1,n2表示兩種介質的折射率。
如下圖:
ps:一般情況下,我們認為真空中(或者說空氣中)折射率n = 1,畢竟我們起碼要選取乙個標準閥值,來推導其他介質的折射率,這裡直接規定真空(空氣)為標準1,那麼其他介質的折射率都比真空要大,也就是》1。
那麼接下來我們通過入射光線計算折射光線,如下圖:
我們通過建立單位圓輔助計算,通過標量推導出向量的模長,然後通過向量平行和同異方向推導出向量,推出ob = od + db = -|cosβ|*oe + |sinβ/sinθ|*(ao + |cosθ|* oe),推導到這裡,我們就把ob的公式用cos sin以及入射光向量ao和介質法向量n來計算了,這時候我們就思考如何計算cosβ cosθ,讓這兩個值使用已知的n1,n2,ao,oe來替換,如下圖:
我們通過斯涅爾定律:n1 * sinθ = n2 * sinβ得到sinβ = n1/n2 * sinθ
點積的概念推出cosθ
cosβ的推導可以先試用sinβ替換,然後替換斯涅爾定律中計算的sinβ得到cosθ的表示,
這個時候我們所有的未知量就全部通過已知值(n1,n2,ao,oe)來表示了,如下圖:
算出來的公式咋一看十分複雜,接下來我們就要通過程式來進行模擬驗證,如下圖:
稀疏向量計算優化小結
在各種演算法中,向量計算是最經常使用的一種操作之中的乙個。傳統的向量計算,學過中學數學的同學也能明確怎麼做。但在如今的大資料環境下。資料一般都會比較稀疏,因此稀疏向量的計算,跟普通向量計算。還是存在一些不同。首先,我們定義兩個向量 a x1,x2,xn b y1,y 2,yn 定義a b的點積為a ...
複數計算和向量計算的區別
今天接觸到了量子計算,原理正在摸索,但是從數學角度,複數計算應該會用到。以前學習複數的時候,純屬應付考試,現在回想只記得乙個公式 今天週末,有時間縷一下,看幾個問題 1 複數裡用到了虛數,看了阮老師的一篇文章,虛數的意義何在 清晰了好多,上學的時候怎麼沒想過這些問題呢?2 看起來複數計算好像跟向量計...
Numpy中向量與標量計算
加減乘除冪運算 import numpy as np a np.array 1,2,3 b np.array 3,2,1 print a 10 對應位置依次相加 print a 2 print 1,2,3 2 print a b print a b print a b print a b print...