Unity Shader:(三)數學基礎
一、向量和標量
向量:包含了模和方向。如 以10km/h的速度向北騎行。
區別於點:向量是一個相對量,所在位置不重要,只要模和方向一致就是相等的。而點表示的就是一個位置。
標量:只有模沒有方向。如 家距離學校1公里。
向量運算:記住向量的位置並不重要,可以通過移動向量的位置,來做向量運算。
B點到A點的位移可以用a-b得到的矢量表示。
單位向量:在實際使用中,我們常常只關注向量的方向,不關注大小,把向量轉換成單位向量的過程叫做歸一化。
數學公式是:單位向量=向量/向量的模
向量乘法:點積和叉積 (重中之重!!!)
點積:結果是一個標量,表示兩個向量的相似度,值越大越相似。
數學公式一:a·b = (ax
幾何意義:a·b等同於b在a方向上的投影值再乘以a的長度。
數學公式二:a·b = |a||b|cosθ
叉積:結果是一個向量,表示兩個向量組成平面的法向量。
數學公式一:a×b = (ax,ay,az)×(bx,by,bz) = ( aybz-azby ,azbx-axbz,axby-aybx )
ax ay az 很不好記吧。下次遇到怎麼辦呢?先在草稿紙上把兩個向量列出來,如左邊所示。
求x要遮住第一列,然後按yz的順序,畫叉叉。
bx by bz 求y要遮住第二列,然後按zx的順序,畫叉叉。
求z要遮住第三列,然後按xy的順序,畫叉叉。
數學公式二:|a×b| = |a||b|sinθ
________________________________________________________________________________________________________________
例題:場景中有一個NPC位於點P處,他的前方用向量V表示,玩家在X點處。
Q1: 判斷玩家在NPC的哪個方向? (X-P)·V 大於0表示玩家和NPC之間的夾角<90°,玩家在NPC前方。小於0表示夾角>90°,玩家在NPC後方。等於0表示夾角=90°,玩家在NPC左/右。
Q2: NPC的視角角度是φ,判斷玩家是否在NPC視角內? 全視角角度是φ,代表能看到左右φ/2的角度。通過點乘 (X-P)·V=|(X-P)||V|cosθ 公式反求得cosθ,cosθ>=cosφ/2表示θ<=φ/2,能看見。
Q3:NPC的觀察距離也有限制? |X-P| <= 觀察距離
二、矩陣
1. 方塊矩陣(方陣):行和列相等的矩陣。
2. 對角矩陣:除了對角線上的元素外其餘都為0。
3. 單位矩陣:對角線上元素都是1的對角矩陣,任何矩陣乘以單位矩陣都還是原來的矩陣。
4. 轉置矩陣:轉換行列矩陣,r×c變成c×r矩陣,Cij 變成Cji。(AB)T = BT AT 。
5. 逆矩陣:方陣乘以它的逆矩陣結果為單位矩陣。一個矩陣可以表示一個變換,那麼逆矩陣就可以還原這個變換。
6. 正交矩陣:方陣乘以它的轉置矩陣結果為單位矩陣。欸?跟上一個好像。所以也有,正交矩陣的轉置矩陣和逆矩陣相等。
這有什麼用呢?因為Shader裡經常需要求還原矩陣,可以用這個性質直接求轉置矩陣更簡單。
但要先判斷是否是正交矩陣,所以就有了更重要的推論:正交矩陣的每一行/列元素是單位向量,而且元素之間互相垂直。
——————————————————————————————————————————————————————————————
矩陣的幾何意義:可以用矩陣來表示一個變換,這個變換包括:旋轉、縮放、平移。
基礎變換矩陣共同點:[M3×3 t3×1]
[01×3 1]
M表示旋轉和縮放,t表示平移。
所以,平移矩陣的長相應該只跟t有關,M是單位矩陣表示不做旋轉和縮放變換。
平移矩陣:[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1]
所以,縮放矩陣跟M有關。
縮放矩陣:[kx 0 0 0]
[0kx 0 0]
[0 0kx 0]
[0 0 0 1]
旋轉矩陣,這就比較複雜了,繞x,y,z軸旋轉的矩陣不一樣!不過旋轉矩陣是正交矩陣。
繞X軸旋轉θ度:[10 0 0]
[0 cosθ-sinθ 0]
[0sinθ cosθ0]
[0 0 0 1]
------------------------------------------------------------
繞Y軸旋轉θ度:[cosθ 0sinθ 0]
[0 10 0]
[-sinθ 0cosθ0]
[0 0 0 1]
------------------------------------------------------------
繞Z軸旋轉θ度:[cosθ-sinθ 00]
[sinθcosθ 0 0]
[0010]
[0 0 0 1]
複合變換:既旋轉又縮放還平移。我們約定的變換順序是:先縮放,再旋轉,後平移。如果用數學表示式,那麼這是三個矩陣,計算順序從右往左。
三、空間變換
1.模型空間(區域性空間):看到區域性你應該懂了。對應Unity裡的區域性座標。
2. 世界空間:根據上一個你應該也懂了。對應Unity裡的世界座標。
3. 觀察空間(攝像機空間):你要看模型的正面,那麼相機的正向和模型的正向是對著的。所以觀察空間的座標系是不一樣的。觀察空間是右手座標系,Z軸是反的。
---------------------------------------------------------------------------------------------------------------------------------------
說到這裡不得不說說頂點著色器。
頂點著色器通常串聯成一個MVP矩陣,第一步做模型變換(將頂點座標從模型空間轉換到世界空間);
第二步做觀察變換(頂點座標從世界空間轉換到觀察空間);
第三步做投影變換(頂點座標從觀察空間轉換到裁剪空間)。
---------------------------------------------------------------------------------------------------------------------------------------