X軸和Y軸的方向不固定。例如,OpenGL和DirectX使用不同的二維笛卡爾坐標系。
三維笛卡爾坐標系;
標準基向量:相互垂直的基向量,長度為1。
正交基:相互垂直但長度不等於1的基向量。
以手的拇指為+x軸,食指為+y軸,中指為+z軸,三個手指相互垂直,左手可以指示的坐標系為左手坐標系:
可以用右手指示的坐標系是右手坐標系:
左手坐標系和右手坐標系不能旋轉以實現坐標軸的重合。
左手坐標系和右手坐標系分別對應左手定則和右手定則,用於定義坐標系中旋轉的正方向。下圖中四個手指指向的方向是正方向:
Unity的模型空間和世界空間使用左手坐標系。請註意,下方右上角的紅色、綠色和藍色軸分別對應X、Y和Z軸:
Unity的觀測空間使用右手坐標系。觀察空間是壹個以攝像機為原點的坐標系。在這個坐標系中,相機的前進方向是Z軸的負方向,這與模型/世界空間的定義相反。也就是說,Z軸坐標的減少意味著場景深度的增加。
點是N維空間中的壹個位置(遊戲中主要使用二維和三維空間),沒有大小或寬度的概念。
二維空間中點的表示:p =(x,y)
三維空間點的表示:p =(x,y,z)
向量是有向線段,其中n是包含模式和方向的空間,沒有位置的概念。
向量的模:向量的長度,非負數。
向量的方向:向量在空間中的方向。
向量的表示類似於點的表示,v =(x,y),v =(x,y,z),v =(x,y,z,w)。
為了區分點和向量,標量在變量書寫中用小寫字母表示,如:a、b、x、y、z等。向量用小寫粗體字母表示,如:a、b、u、v等。
向量通常有壹個箭頭:
標量是只有模而沒有方向的量,如距離、速度等。
向量不能與標量相加或相減,但可以相乘或相除。
向量和標量的乘法:
kv =(kv x,kv y,kv z)
向量可以除以非零標量,但不能用作除數:
從幾何學上講,將向量v乘以標量k意味著將向量v縮放|k|的大小。如果k《0,向量方向反轉,如下圖所示:
兩個向量的加法和減法,即兩個向量的相應分量相加和相減,公式如下:
a+b =(a x+b x,a y +b y,a z +b z)
a-b =(a x-b x,a y -b y,a z -b z)
幾何上,向量加法,即把向量A的頭連接到向量B的尾,然後從A的尾到B的頭畫壹個向量,得到A和B相加後的向量,如下圖所示:
也可以這樣理解:壹個點從a的尾部移動a,當它移動b時,它相當於移動a+b,這就是所謂的矢量加法的三角形法則。
向量的減法是相似的:
在圖形中,向量通常用於描述位置偏移(簡稱位移)。我們可以使用向量加減法來計算壹個點相對於另壹個點的位移。
矢量的模是壹個標量,可以理解為矢量在空間中的長度。符號通常由向量兩側的垂直線表示,例如| v |。
三維矢量的模數計算公式:
其他維度中向量的模數計算類似,每個分量的平方相加以打開根號。下圖可以解釋其幾何意義:
單位向量是指模數為1的向量,也稱為歸壹化向量。通常用於只關心方向而不關心模式的向量中,例如模型發現的方向和光源的方向。
將非零向量轉換為單位向量的過程稱為歸壹化。
單位向量表示為:
單位向量公式:
零向量:每個分量的值都為0的向量,例如v =(0,0,0)。零向量無法正常化,因為除數時分母不能為0。
在幾何學上,對於二維空間,單位向量是從圓心到圓的邊界的向量:
對於三維空間,單位向量是從圓心到球體的向量。
在Unity著色器中,經常會遇到法線方向和光源方向。這些向量不壹定是歸壹化向量,計算時需要歸壹化成單位向量。
向量乘法有兩種類型:點積和叉積。
向量的點積也稱為內積。點積的運算意思是:a b,中間點不能省略。
點積公式1:
a b =(ax,ay,az)(bx,by,by)= axby+ayby+azbz
點積滿足交換律:
甲乙=甲乙
點積的幾何意義:投影。
投影的值可能為負,投影結果的符號與兩個向量A和B的方向有關:方向相反,結果小於0;同方向,結果大於0;方向是垂直的,結果等於0。
自然1:
點積可以與標量乘法結合使用。
(ka)b = a(kb)= k(ab)
k的幾何意義是縮放矢量。
自然2:
點積可以與向量加減法結合使用。
a(b+ c)= a b+ a c
將c改為-c是減法版本。
自然3:
向量和自身的點積的結果是向量模的平方。
v v = v x v x + v y v y + v z v z = | v | 2
向量模數可以向量點積的形式找到,可以直接比較或計算Shader中常用模數的平方,以減少打開造成的性能消耗。
點積公式2:
a b = | a || b |cosθ
公式2的證明:
假設兩個單位向量是點積。
如下圖所示:
從上圖可以看出,cosθ對應的直角邊為:A B的點積(B向量在A向量上的投影),而cosθ =直角邊/斜邊,則A B的點積= cosθ *斜邊,因為單位向量B的模為1(斜邊的長度為1),所以:A B的點積=
根據前面的屬性1,可以推導出公式2:
根據公式2,點積可用於找出兩個向量之間的夾角:
叉積,也稱為外積。與點積不同,叉積的結果仍然是向量,而不是標量。
叉積的表示:a×b,十字符號不能省略。叉積的計算公式如下:
a x b =(a x,a y,a z)x(b x,b y,b z)=(a y b z-a z b y,a z b x -a x b z,a x b y -a y b x)
具體的符號可以是這樣的:
叉積不滿足交換律,即a×b≠b×a;但叉積滿足反交換律,即a×b =-(b×a)。
叉積不滿足結合律,即:(a x b)x c≠a x(b x c)。
叉積的幾何意義;
作為兩個向量叉積的結果,將獲得壹個與兩個向量都垂直的新向量。
叉積模量
公式:
| a x b | = | a || b |sinθ
這很容易與求面積的平行四邊形聯系起來:
面積A = | b | h = | b |(| A | sinθ)= | A | | b | sinθ。
叉積方向
從幾何意義上,我們可以知道兩個向量的叉積會得到壹個新的垂直於這兩個向量的向量,但有兩個向量垂直於它們。這時,之前學習的左/右手坐標系就派上用場了,它用於確定叉積將采用哪個方向來獲得新矢量。
將拇指放在與A相同的方向上,食指放在與B相同的方向上,中指指向的方向是叉積結果的方向,因此使用左右手將得到不同的方向,如下所示:
同樣,左手定則也可以用來判斷,如下圖所示:
矩陣是由m x n個標量組成的矩形數組,這些數字通常在左右兩邊用方括號括起來,如下所示:
有些材料也使用括號或花括號,但它們都是壹樣的。
矩陣中有行和列,上圖中的數組是三行四列。以3x3矩陣為例,它可以寫成:
Mij表示該元素位於矩陣m的第I行第J列。
向量,我們通常寫為:a =(x,y,z),可以看出向量和矩陣壹樣,也是壹個數組。根據矩陣的寫法,向量可以看作是N×1的列矩陣或1×N的行矩陣,其中N對應於向量的維數。
以向量v =(3,8,6)為例,寫出壹個行矩陣:
[3, 8, 6]
寫為列矩陣:
為什麽它與向量相關聯?由於著色器中經常將法線(向量)轉換為坐標,而坐標轉換是矩陣的幾何意義,因此需要使用矩陣運算將法線從模型空間轉換到世界空間。(您稍後會了解到)
與向量類似,矩陣與標量相乘後的結果仍然是矩陣。公式如下:
當矩陣乘以壹個矩陣時,結果也是壹個矩陣。新矩陣的維數與兩個原始矩陣的維數相關。將rxn的矩陣A與nxc的矩陣B相乘後,結果AB是rxc大小的矩陣。應當註意,第壹個矩陣中的列數必須等於要相乘的第二個矩陣中的行數。
例如,矩陣A的維數是4x3,矩陣B的維數是3x6,AB的維數是4x6。
矩陣乘法的表達式:
假設矩陣A的rxn和矩陣B的nxc相乘得到矩陣C = AB的rxc,那麽C中的每個元素Cij等於A的第I行對應的向量和B的第J列對應的向量點乘的結果,即:
簡單解釋為:
對於每個元素c ij,找出A中的第I行和B中的第J列,將它們對應的元素相乘並相加,這個和就是c ij。
自然1:
矩陣乘法不滿足交換律:AB ≠ BA。
自然2:
矩陣乘法滿足結合律:(AB)C = A(BC),abcde =((A(BC))d)e =(AB)(CD)e
方陣,簡稱方陣。指行數和列數相等的矩陣,如3x3和4x4矩陣。
正方形矩陣特有的元素:對角線元素-行數和列數相等的元素。只有非零對角元素的矩陣稱為對角矩陣。
對角元素為1的對角矩陣稱為單位矩陣,用I n表示,例如:
單位矩陣特性:任何矩陣乘以它的結果仍然是原始矩陣。相當於標量中1的位置。
MI = IM = M
轉置矩陣實際上是對原矩陣的壹種運算,即轉置運算。rxc的壹個矩陣M,其轉置表示為M T,是cxr的壹個矩陣,其本質是原矩陣的行和列的交換。
自然1:
矩陣轉置等於原始矩陣。
T = M
自然2:
串聯矩陣的轉置等於逆串聯矩陣的轉置。
T = B T A T
只有方陣才有逆矩陣,表示為M -1。矩陣與其逆矩陣相乘得到單位矩陣:
MM -1 = M -1 M = I
這有點像標量中的倒計時。
並非所有方陣都有對應的逆矩陣,例如,所有元素都為0的矩陣。
如果壹個矩陣有對應的逆矩陣,則它是可逆的或非奇異的;
相反,它是不可逆的或奇異的。
判斷矩陣是否可逆:
如果矩陣的行列式不為0,則它是可逆的。
參考視頻鏈接:/video/bv 1aw 411q7x 1?p=2
自然1:
逆矩陣的逆矩陣就是原矩陣本身。
(M-1)-1 = M
自然2:
單位矩陣的逆矩陣是自身。
I -1 = I
自然3:
轉置矩陣的逆矩陣是逆矩陣的轉置。
(M ^ T)-1 =(M-1)T
自然4:
級數相乘的矩陣的逆矩陣等於反級數中每個矩陣的逆矩陣。
(AB)-1 = B- 1 A-1
(ABCD)-1 = D-1 C-1 B- 1 A-1
矩陣的幾何意義是變換,逆矩陣的意思是恢復這種變換或這種變換的逆變換。
原始向量v將通過使用變化矩陣M對向量v進行壹次變換,然後使用逆矩陣M -1對其進行壹次變換來獲得。
M-1(M v)=(M-1M)v = I v = v
正交矩陣是壹種特殊的方陣。如果壹個正方形m和它的轉置矩陣的乘積是單位矩陣,那麽這個矩陣是正交的。
MM T = M T M = I
根據逆矩陣MM -1 = M -1 M = I的性質,可以得出正交矩陣的逆矩陣是其轉置矩陣的結論:
M T = M -1
正交矩陣可以用轉置矩陣的運算代替逆矩陣的運算,因為逆矩陣的計算比較復雜。
如何判斷壹個矩陣是否正交?讓我們看看它的定義是什麽。
因為:
所以:
因此我們可以得出以下結論:
壹個向量(如平行光的方向和表面發現的方向)可以以行矩陣或列矩陣的形式寫入,但當它與矩陣相乘時,使用行矩陣還是列矩陣對寫入順序及其乘法的結果值有影響。
假設有壹個向量v =(x,y,z),寫成行矩陣:v =【x y z】,寫成列矩陣:v =【x y z】T(這裏用轉置符號表示列矩陣的寫法,純粹是為了排版)。此外,還有壹個矩陣m:
當m乘以行矩陣時,可寫成:
v M =【XM 11+ym 21+zm 31 XM 12+ym 22+zm 32 XM 13+ym 23+zm 33】
當m乘以列矩陣時,可寫成:
可以看出,書寫順序和乘法結果中的元素也是不同的。
在Unity中,向量通常被視為列矩陣,因此在乘法時,向量被放置在矩陣的右側,讀取順序為從右到左。例如:
CBA v =(C(B(A v)))
意思是V先用A矩陣變換,再用B矩陣變換,最後用C矩陣變換。