要會寫Shader,需要掌握一些基本的空間知識,比如空間座標,矢量,線性代數等。下面介紹一些相關知識。
座標系:
常見的座標系分爲二維座標系和三維座標系,二維座標系比較容易理解,它就是我們初中就已經接觸過的X-Y軸座標系,相信大家都已經有所認識,不再贅述。三維座標系比二維座標系多了Z軸,也多了一些特性。三維座標系可以分爲左手笛卡爾座標系和右手笛卡爾座標系。之所以存在2種座標系,是因爲兩種座標系無論如何旋轉都無法使軸向和另一種座標系完全相同。
左手笛卡爾座標系:
伸出左手,拇指的指向爲X軸,食指指向爲Y軸,中指指向爲Z軸,這樣便構成了左手笛卡爾座標系。Unity使用的是左手笛卡爾座標系。
右手笛卡爾座標系:
伸出右手,拇指的指向爲X軸,食指指向爲Y軸,中指指向爲Z軸,這樣便構成了右手笛卡爾座標系。我們觀察一下左右手座標系的異同點:①伸出的手不同,②手指的順序相同都是拇指-食指-中指。
左手法則:
目的是確定旋轉方向。左手法則應用於左手笛卡爾座標系,左手變成一個點讚的手勢,拇指指向和軸方向相同,那麼其他手指的指向就是旋轉的正方向。
右手法則:
右手法則應用於右手笛卡爾座標系,原理同上。
OpenGL屏幕座標:
左下角爲原點。
DirectX屏幕座標:
左上角爲遠點。
矢量:
既有大小又有方向的量。矢量雖然和點的結構一樣,都可以用Vector3來表示,但它們的意義不同。矢量在很多時候強調它的方向性,比如法線方向。而點更多的是描述物體的位置。
1、矢量減法:c = a - b,得到的結果是b矢量的末尾指向a矢量的末尾;
2、矢量加法:c = a + b,調整b矢量的位置,將a矢量的末尾指向b矢量的頭,得到從a矢量的頭出發連接到b矢量的末尾的矢量;
3、矢量點積:a · b = |a||b|,它的幾何意義是兩個矢量之間的投影大小,也可以用於計算兩個矢量之間夾角的大小;
4、矢量叉積:|a * b| =|a||b|sin ,它的幾何意義是,得到垂直於a,b矢量所在平面的方向。
矩陣:
《線性代數》這門課程主要學習的內容就是矩陣,那麼線性代數和矩陣有什麼關係呢?這是因爲數學家發現線性代數的很多運算可以用矩陣來表達。多個線性代數構成的函數塊,提取他們的代數構成矩陣,通過矩陣運算可以簡化代數運算過程(大概就是這個意思,我也沒太弄懂。。。)。圖形學利用矩陣的一些特性,和運算來表達圖形的移動、旋轉、縮放。矩陣形如:
行矩陣:矩陣分爲行和列,水平方向爲行,豎直方向爲列,當行爲1時,此矩陣爲行矩陣,形如M13:
列矩陣:列數爲1的矩陣成爲列矩陣,形如M31:
方塊矩陣:行數和列數相等的矩陣成爲方塊矩陣,圖形學裏用的最多的是3×3和4×4矩陣。
對角矩陣:除了對角線,其餘元素都爲0的方塊矩陣,即是對角矩陣。形如:
單位矩陣:對角線元素都爲1的對角矩陣是單位矩陣,記爲,形如:
轉置矩陣:對矩陣進行翻轉,行變爲列,例如第一行變爲新矩陣第一列,第二行變爲新矩陣第二列,例如:
轉置後
逆矩陣:兩個方陣相乘,結果爲單位矩陣,那麼第二個矩陣是第一個矩陣的逆矩陣,記爲,則有 = 。如果一個矩陣具有逆矩陣,那麼這個矩陣是可逆的,或者說是非奇異的,與此相反,如果一個矩陣沒有逆矩陣,那麼這個矩陣是不可逆的,或者說是奇異矩陣。逆矩陣的幾何意義在於,對一個矩陣的變換(矩陣相乘),可以通過乘逆矩陣來還原。逆矩陣和轉置矩陣包含很多特性,如下:
①逆矩陣的逆矩陣是原矩陣:
②單位矩陣的逆矩陣是它自身:
③轉置矩陣的逆矩陣是逆矩陣的轉置:
④矩陣相乘的逆矩陣等於反向相乘各個矩陣的逆矩陣:
正交矩陣:如果一個方陣M和它的轉置矩陣的乘積是單位矩陣,這個矩陣就是正交的。公式:
正交矩陣也擁有很多特性,對圖形學來說,正交矩陣經常用於通過簡單地求解轉置矩陣來獲得逆矩陣。其他特性如下(②③是把矩陣的每一行看作向量):
①正交矩陣的逆矩陣和轉置矩陣相等:
②矩陣的每一行都是單位向量:
③矩陣行與行之間都相互垂直:
矩陣乘法:矩陣乘法不滿足交換律,滿足結合律。從結構上看,第一個矩陣的列數必須和第二個矩陣的行數相等,公式: = 。矩陣相乘後仍然是矩陣。矩陣的相乘運算比較複雜,結果矩陣的第i行,第j列元素的值等於A矩陣的第i行元素依次乘以B矩陣第j列的元素,並求和。舉個例子 = ,那麼現在的第1行,第2列的元素值是多少呢?
= = = 1 * 3 + 2 * 9 = 21
幾何變換部分(縮放,旋轉,平移)
齊次座標:
爲了達到一些運算目的,將座標提高一個維度後得到新的座標,這個座標就稱爲齊次座標。在圖形學中,爲了能實現平移,常常將3維的座標空間提高爲4維的座標空間。這裏特地說明一下,Unity的矩陣乘法遵循右乘的規則,即從右乘到左,而不是我們習慣的從左乘到右。
幾何變換:
通過乘以變換矩陣,對一個點進行座標變換,變換順序爲縮放,旋轉,平移,這個變換矩陣一般爲:
其中用於旋轉和縮放,用於表示平移,表示0矩陣,1表示標量。
平移矩陣:此時是單位矩陣,的x,y,z分別表示xyz軸的移動距離。
縮放矩陣:此時是對角矩陣,是零矩陣,k1,k2,k3分別表示對xyz軸的縮放。
旋轉矩陣:旋轉矩陣是正交矩陣,Unity的旋轉順序是zxy,這裏特地講解一下Unity的旋轉順序。其實這裏的旋轉順序zxy指的是物體相對於世界座標系的旋轉順序,如果你以物體的局部座標系來作爲觀察空間,那麼此時的旋轉順序是yxz,剛好和前面的順序想反。手動試驗一下更容易理解~
x軸旋轉:
y軸旋轉:
z軸旋轉:
//矩陣行列式: