[Graphics] 光源反射向量圖形意義(Vector Reflection)
本篇將以圖形意義說明反射向量計算公式,若有興趣了解 r = d-2(d ∙ n) n 的物理意義的話,歡迎參考看看唷。
最近在寫 Phong Lighting Model[1] 時直接用了內建 API— reflect()[2],來計算光源碰到平面的反射角。後來想說查一下如果沒有這個 API 的話,要怎麼計算反射向量。於是,查到了這個式子:
r = d-2(d ∙ n) n
看著這個公式,畫著向量在紙上,想不懂為什麼這樣可以算出反射向量。於是花了點時間想了一下反射向量公式的圖形意義,也查到了這篇很棒的示意圖 — Vector reflection at a surface[3],在這裡筆記起來,若有相同疑問的話,歡迎參考看看唷。
💡 Contents:
1. 反射向量計算公式
2. 物理意義
3. 總結
1. 反射向量計算公式
反射向量計算公式為:
r = d-2(d ∙ n) n
在這邊假設向量都已正規化(normalized),即向量長度都為 1。
2. 物理意義
接下來,用向量的方式來看看這個公式怎麼導出來的吧!
- 為了方便後面理解,先畫出 d 的反方向 d’,即 d’ = -d。
2. 將 d’ 投影到 n,即圖中 (d’ ∙ n) n。
3. 用向量加法,則可導出紫向量 d + (d’ ∙ n) n,因為向量加法在圖形上的意義是起點連向終點的向量。
4. 把這個向量拉長兩倍,就會延伸如下圖 2(d + (d’ ∙ n) n)。
5. 最後一步了!同樣依向量加法的物理意義,可得反射向量 r = d’ + 2(d + (d’ ∙ n) n)。整理整理之後,就變成網路上查到的反射向量公式啦!
3. 總結
本篇中,我們以向量的圖形意義走過反射向量公式 r = d -2(d ∙ n) n 的由來。雖然現在很多 API 很方便,但了解背後原理的好處是,可以增加一些 sense。有時候比較進階的演算法是從基本的模型變形而來,有事沒事看看背後的原理能增加一些感覺。如果對先前提到的 Phong Lighting Model 的實作有興趣的話,原始碼放在 Github [4],歡迎參考看看唷。
-2024.07.04。
想敲碗什麼樣的內容,或資訊有誤/欲補充的話,歡迎在下方留言讓我知道,不好意思公開的話,也歡迎在Google 表單留言 : )
如果覺得文章有幫助的話,也歡迎點擊連結,贊助我一杯咖啡唷☕