【Unity Shader入門】Shader數學基礎:向量(矢量)

【Unity Shader入門】Shader基礎概念:渲染流水線
【Unity Shader入門】Shader編程基礎:ShaderLab語法
【Unity Shader入門】Shader數學基礎:向量(矢量)
【Unity Shader入門】Shader數學基礎:矩陣
【Unity Shader入門】Shader數學基礎:矩陣變換
【Unity Shader入門】Shader編程初級:Shader結構

前言

笛卡爾座標系

二維笛卡爾座標系

一個二維的笛卡爾座標系包含了兩個部分的信息:
一個特殊的位置,即原點,它是整個座標系的中心。
兩條過原點的互相垂直的矢量,即X軸和Y軸。這些座標軸也被稱爲是該座標的矢量。
OpenGL 和 DirectX 使用了不同的二維笛卡爾座標系。OpenGL也就是Unity默認的座標系是以左下角爲原點,DirectX是以左上角爲原點。如下圖:
在這裏插入圖片描述

三維笛卡爾座標系

在三維笛卡爾座標系中,我們需要定義三個座標軸和一個原點在這裏插入圖片描述
3個座標軸被稱爲該座標系的基矢量,3個座標軸互相垂直,長度爲1,這樣的基矢量被稱爲標準正交基,如果長度不爲1,被稱爲正交基。當然,座標軸方向也不是固定的,涉及到z軸向裏爲正還是向外爲正,也就有了大家熟知的左手座標系和右手座標系。

三維笛卡爾座標系分爲2種不同的座標系:左手座標系(left-handed coordinate space)和右手座標系(right-handed coordinate space)。
在這裏插入圖片描述在這裏插入圖片描述
Unity使用的是左手座標系。但對於觀察空間來說,Unity使用的是右手座標系。觀察空間,通俗來講就是以攝像機爲原點的座標系。在這個座標系中,攝像機的前向是z軸的負方向,這與在模型空間和世界空間中的定義相反。也就是說,z軸座標的減少意味着場景深度的增加。

點和向量

介紹

點(point):是n維空間(遊戲中主要使用二維和三維空間)中的一個位置,它沒有大小、寬度這類概念。

向量(vector,也被稱爲矢量):是指n維空間中一種包含了模(magnitude)和方向(direction)的有向線段。速度(velocity)就是一種典型的向量。向量被用於表示相對於某個點的偏移,也就是說是一個相對量。
向量的模:指的是這個向量的長度。一個向量的長度可以是任意的非負數。
向量的方向:則描述了這個向量在空間中指向。
向量通常由一個箭頭表示
向量的頭(head):是它的箭頭所在的端點處。
向量的尾(tail):是另一個端點處。
只要向量的模和方向保持不變,無論在哪裏,都是同一個向量。

標量(scalar):只有模沒有方向。例如距離(distance)就是一種標量。

區別

向量可以用於表示相對於另一個點的位置,此時向量的尾是一個位置,那麼向量的頭就可以表示另一個位置了。如果我們把向量的尾固定在座標系原點,那麼這個向量的表示就和點的表示重合了。儘管點和向量在數學表達式上都是一樣的,但區分點和向量之間的不同是非常重要的。可以這樣理解,任何一個點都可以表示成一個從原點位置出發的向量。

點:沒有大小之分的空間中的位置
向量:有模和方向,但是沒有位置的量,相對量(可以描述相對位置),如果向量的頭尾都固定在座標系的原點,則這個向量就和點重合了。

向量運算

向量和標量的乘法和除法

把一個向量和一個標量相乘,意味着對向量進行一個大小爲標量的縮放。

kv=(kvx,kvy,kvz) k\overrightarrow v=(k v_x,k v_y,k v_z)
一個向量也可以被一個非零的標量除。這等同於和這個標量的倒數相乘。

vk=(x,y,z)k=1k(x,y,z)=(xk,yk,zk),k0 \frac {\overrightarrow v}k=\frac{ (x,y,z) } k=\frac 1k (x,y,z)=(\frac xk,\frac yk,\frac zk),k≠0

注意:對於乘法來說,向量和標量的位置可以互換的。但對於除法,只能是向量被標量除,而不能是標量被向量除,這是沒有意義的。當k<0時,向量的方向也會取反

例如,如果想把一個向量放大兩倍,就乘以2,。當標量小於0時,向量的方向也會相反。

向量的加法和減法

兩個向量進行相加或相減,其結果是一個相同維度的新向量。需要注意的是,一個矢量不能和一個標量相加或相減。矢量的加減法遵守三角法則。

a+b=(ax+bx,ay+by,az+bz) \overrightarrow a+\overrightarrow b=(a_x+b_x,a_y+b_y,a_z+b_z)
ab=(axbx,ayby,azbz) \overrightarrow a-\overrightarrow b=(a_x-b_x,a_y-b_y,a_z-b_z)
在這裏插入圖片描述

向量的模

向量的模是一個標量,是向量在空間中的長度。對於二維向量,其實就是使用了勾股定理,兩個直角邊的長度爲向量的分量的絕對值,斜邊的長度爲向量的模。
ababab 向量\overrightarrow {ab}的大小,也就是向量\overrightarrow {ab}的長度(或稱模),記作|\overrightarrow {ab}|
v=vx2+vy2+vz2 |\overrightarrow v| = \sqrt {v_x^2 + v_y^2 + v_z^2}

單位向量

很多情況下,我們只關心向量的方向而不是模。比如光照模型中,往往需要知道法線方向和光源方向,這種情況下我們不關心向量有多長,這樣就需要計算單位向量。單位向量指的是模爲1的向量,也被稱爲被歸一化的向量(normalized vector),而把非零向量轉換爲單位向量的過程被稱爲歸一化。計算單位向量公式如下:
v^=vv,v |\hat v|= \frac v {|v|},v是非零向量

向量點積

點積有兩種定義方式:代數方式和幾何方式。通過在歐氏空間中引入笛卡爾座標系,向量之間的點積既可以由向量座標的代數運算得出,也可以通過引入兩個向量的長度和角度等幾何概念來求解。

代數方式

ab=(ax,ay,az)(bx,by,bz)=axbx+ayby+azbz a \sdot b = (a_x,a_y,a_z) \sdot (b_x,b_y,b_z) = a_xb_x + a_yb_y + a_zb_z
矢量的點積滿足交換律:
ab=ba a \sdot b = b \sdot a
點積具有一些很重要的性質,在Shader計算中,我們經常利用這些性質來幫助計算。
性質一:點積可以結合標量乘法,也就是說,對點積中其中一個矢量進行縮放的結果,相當於對最後的點積結果進行縮放,即:
(ka)b=a(kb)=k(ab) (ka)\sdot b = a \sdot (kb) = k(a\sdot b)
性質二:點積可以結合矢量加法和減法,也就是說,點積的操作數可以是矢量相加或相減後的結果。即:
a(b+c)=ab+ac a \sdot (b + c)= a \sdot b + a \sdot c
性質三:一個矢量和本身進行點積的結果,是該矢量的模的平方,這可以用來比較兩個矢量的長度大小。
vv=vxvx+vyvy+vzvz=v2 v \sdot v= v_xv_x + v_yv_y + v_zv_z = |v|^2

幾何方式

ab=abcosθ a \sdot b = |a| |b| \cos \theta
兩個矢量的點積可以表示爲兩個矢量的模相乘,再乘以他們之間夾角的餘弦值。
利用餘弦定理推導:
c2=a2b22abcosθ |c| ^2= |a|^2 |b|^2 - 2|a| |b| \cos \theta
c2=cc=(ab)(ab)=aa+bb2ab |c| ^2= c \sdot c = (a-b) \sdot (a-b) = a \sdot a + b \sdot b - 2a \sdot b
從這個公式可以看出兩個向量的夾角對於點積結果的影響,小於90度爲正,等於90度爲0,大於90度爲負。還可以用反餘弦求出兩個向量的夾角。
cosθ=abab \cos \theta = \frac {a \sdot b}{|a| |b|}
在這裏插入圖片描述

幾何意義

點積的幾何意義中一個重要的幾意義是投影(projection),點積的符號可以讓我們知道兩個矢量的方向關係。
在這裏插入圖片描述

向量叉積

叉積在圖形學中常用於計算垂直於一個三角面的向量,用於判斷三角面片的朝向等。
ab=(ax,ay,az)(bx,by,bz)=aybzazby,azbxaxbz,axbyaybx) a\wedge b=(a_x,a_y,a_z)\wedge (b_x,b_y,b_z) =(a_yb_z-a_zb_y,a_zb_x-a_xb_z,a_xb_y-a_yb_x)
在這裏插入圖片描述
三維向量叉積的計算規律。不同顏色的線表示了計算結果向量中對應顏色的分量的計算路徑。
以紅色爲例,即結果向量的第一個分量,它是從第一個向量的y分量出發乘以第二個向量的z分量,再減去第一個向量的z分量和第二向量的y分量的乘積

向量的叉積滿足反交換律:
ab=ba a\wedge b=-b\wedge a
向量的叉積不滿足交換律,也不滿足結合律:
ab/=ba a\wedge b \mathrlap{\,/}{=} b \wedge a
(ab)c/=a(bc) (a\wedge b) \wedge c \mathrlap{\,/}{=} a \wedge (b \wedge c)

叉積的幾何意義:
兩個向量叉積會得到一個同時垂直於這兩個向量的新向量
ab=absinθ,ab:ab |a \wedge b|= |a| |b| sin \theta ,其中|a \wedge b|的值爲:以a和b爲兩邊的平行四邊形的面積
在這裏插入圖片描述
我們知道兩個方向互不平行的向量可以確定一個平面,所以叉積最常見的應用就是計算垂直於一個平面的向量,我們後面會在頂點法線,切線那裏用到。

二維座標系旋轉

二維座標系平移

二維座標系旋轉和平移

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章