求反射向量
在圖形學中,計算光照模型時,經常需要求取反射向量,一般的shader函數庫都提供計算反射向量的方法,下面介紹一下如何手動計算反射向量。
給定入射光線向量I和平面法向量N,求反射向量R,如下圖。為了方便計算,這里假定I和N都是單位向量(模為1,編程時可先將I和N單位化)
方法一
設入射光線向量I和反射平面的法向量N之間的夾角為theta。連接I的始端和R的末端,則有
R = 2P - I (1)
現在問題變成了如何求取P,設入射點0到P與N的交點的向量為S,那么有
P = I + S (2)
現在問題變成了如何求取向量S,向量S即向量-N(注意,這里是-N,因為S和N的方向相反。)在向量N上的投影,根據向量的投影公式有
因為N是單位向量,簡化一下得到
將S代入公式(2),再將P代入公式(1)得到
方法二
將R平移一下,與向量N的延長線相交。
由於入射角和反射角相等,且I和R的長度也相等,所以三角形ION是等腰三角形。故有
ON = 2S
所以有
R = I + 2S
而S是-I在N上的投影,所以有
由於N是單位向量,簡化一下得到
所以
貌似方法二更直觀些。
向量投影
給定一個向量u和v,求u在v上的投影向量,如下圖。
假設u在v上的投影向量是u’,且向量u和v的夾角為theta。一個向量有兩個屬性,大小和方向,我們先確定u’的大小(即長度,或者模),從u的末端做v的垂線,那么d就是u’的長度。而u’和v的方向是相同的,v的方向v/|v|也就是u’的方向。所以有
(1)
再求d的長度。
(2)
最后求cos(theta)
(3)
聯合求解方程(1)(2)(3)得到
這就是最終的投影向量。
而這個向量的長度d是
============================
以下是舊的推導,也保留。