當前位置:編程學習大全網 - 編程語言 - Shader筆記——3D數學基礎

Shader筆記——3D數學基礎

在3D世界中,為了確定不同頂點所在的位置,需要使用坐標表示,二坐標的數值是基於壹個固定的參照點進行定位的,這個點就是坐標原點。

通常情況下,原點的坐標壹般都是(0,0)。

如果把所有的坐標匯集在壹起管理,那就構成了壹個坐標系。壹個完整的坐標系會包含原點,方向和坐標。

3D中涉及各種坐標系,從維度進行區分,所有坐標系可以分為平面直角坐標系和空間直角坐標系。

在空間坐標系中,根據坐標方向的不同又可以分為左手坐標系和右手坐標系。

若將大拇指設定為x軸,食指設定為y軸,中指設定為z軸,左右手坐標系如圖:

在數學中,坐標屬於標量,只表示大小,不表示方向。

而同時表示長度和方向信息的,稱之為向量(Vector),或者叫“矢量”。頂點的法線向量,切線向量等都是向量。

假設二維向量 a 的起點A,終點為B,使用B的坐標減去A的坐標,即可計算出個向量 a

二維向量 a 的計算公式如下:

若將公式推廣到三維空間,假設三維向量 a 的起點A,終點B,則三維向量 a 的計算公式如下:

如果倆個向量的長度相等但方向相反,則這倆個向量互為相反向量。

零向量的相反向量是它本身。

從幾何的角度來講,將壹個向量的起點作為終點,而原本的終點作為起點,最終得到的向量就是原向量的相反向量。

假設向量 a 的起點A,終點B, a 的相反向量 b ,表示如下:

向量包含長度和方向,向量的長度被稱為向量的模。如向量 a 的模表示為| a |。

如圖通過勾股定理,求得

二維向量 a 的模長計算公式為:

如圖通過倆次勾股定理,求得

“單位向量”是指模長為1的向量。

在很多情況下向量的方向比向量的長度更值得關註,如燈光的照射方向,攝像機的查看方向等。為了計算方便,可將這種向量轉變為單位向量,這個轉變的過程稱為向量的標準化(Normalize)。

從代數的角度來講,壹個非零向量除以自身的長度,既可以將自身長度縮放為1。零向量的長度為0,在數學中0作為被除數沒有意義。

因此非零向量 a 的標準化向量為:

單位向量與原向量相比,只是長度發生了改變,方向保持不變。

從幾何的角度來講,向量的加法運算滿足三角形法則。

向量的加法運算可以推廣到多個數量相加,最終結果是從第壹個向量的起點指向最後壹個向量的終點,長度為起點與終點之間的距離。

從代數的角度來講,向量的加法就是將相同的分量進行相加。

向量的減法運算可以理解為壹向量與另壹向量的相反向量做加法運算,同樣滿足三角形法則。

向量 a b 的減法運算轉變為與相反向量的加法運算:

相同起點的倆個向量相減,得到的向量為第二個向量的終點指向第壹個向量的終點,長度為倆終點之間的距離。

從代數的角度來講,向量的減法運算就是將相同的分量相減。計算公式如下:

將向量乘以壹個標量,可產生向量縮放的效果。如圖:

假設向量 a =(x,y,z),向量縮放k倍公式為:

向量 a b 的點積寫作 a . b

在代數中,點積又叫做內積,倆個向量點積的結果就是對應所有分量相乘之後的和。點積的結果是數值。

點積計算公式為:

在幾何中,倆個向量點積的結果就是壹個向量在另外壹個向量上的投影長度與這個向量長度的積。

點積的計算公式為:

向量的叉積又稱為外積,叉積的結果是向量。向量 a b 的叉積寫作 a × b

叉積的計算公式為:

在幾何中,叉積得到的向量與 a b 所在平面垂直,長度等於向量 a b 組成的平行四邊形的面積,該向量被稱為法向量。如圖:

假設將叉乘的倆個向量顛倒順序, b a 叉乘所得向量的方向將會朝下。

常用的向量運算法則如下所示:

向量可以使用橫向排列的數組表示,假設縱向上繼續排列相同維度的數組,最後組成的數組就是——矩陣(Matrix)。

向量的維度表示表示該向量所包含數的個數,同樣的,矩陣的維度表示了該矩陣所包含的行和列的數量。通常使用r(raw的首字母縮寫)表示行數,使用c(column的首字母縮寫)表示列數,而矩陣本身則使用黑斜體大寫字母表示,如 M

壹個3×3的矩陣 M 以及所對應的所有分量可以如下表示:

行數和列數相等的矩陣稱為方陣。

方陣中行號和列號相等的分量稱為對角元素,其他分量稱為非對角元素。非對角元素全為0的矩陣稱為對角矩陣。

在對角矩陣中,對角元素全為1的矩陣叫作單位矩陣。

任何矩陣乘以單位矩陣,最終得到的結果與原矩陣相同。單位矩陣對於矩陣的作用就像1對於標量的作用壹樣。

假設將壹個r×c的矩陣 M 沿著對角線翻轉,得到的新矩陣稱為矩陣 M 的轉置矩陣(Transpose Matrix)。

轉置矩陣的重要法則:將壹個矩陣轉置之後再進行轉置,得到的矩陣與原矩陣相同,公式如下:

跟向量類似,矩陣也可以與標量相乘,中間不需要寫運算符號,相乘之後的結果與原矩陣維數相同,然後將每個分量乘上這個標量。公式如下:

當第壹個矩陣的列數等於第二個矩陣的行數,這倆個矩陣才可以相乘,得到矩陣的行數等於第壹個矩陣的行數,列數等於第二個矩陣的列數。

在Shader中,向量也可以與矩陣相乘,相乘的時候可以把向量看作行數為1或列數為1的矩陣。

向量(x,y,z)可以橫向寫成1×3的矩陣,被稱為行向量:

也可以寫成3×1的矩陣,被稱為列向量:

向量與矩陣相乘的幾何意義是實現向量的空間變換。

在3D中,所有的變換都是通過矩陣完成的,包括常用的平移,旋轉,縮放,除此之外,還有坐標空間之間的變換也是通過矩陣完成的。

假設向量 v = (x,y,z),可以表示為

假設平面坐標系的倆個坐標向量分別為 p = (1,0), q =(0,1),繞原點逆時針旋轉角度之後如圖:

左右手坐標系中的旋轉方向完全不同,倆種坐標系中的旋轉方向的判斷方法:先伸出與坐標系對應的那只手,握住旋轉軸並且保持大拇指的朝向與旋轉軸的正方向壹致,其余四指的朝向即為旋轉的正方向。如圖,弧線箭頭所示的方向即為右手坐標系的旋轉正方向。

左右倆種坐標系對應的旋轉方向歸納如下:

這裏只講解繞坐標軸旋轉的情況。

將空間坐標系繞x軸旋轉,空間坐標系中的旋轉方向如圖:

x軸上的所有坐標都不會發生改變,從x軸正方向朝負方向觀察坐標系,y軸和z軸的旋轉情況完全跟平面坐標系的旋轉情況壹樣,如圖:

最終繞x軸旋轉角度的變換矩陣為:

空間坐標系繞y軸的旋轉方向如圖:

從y軸正方向朝負方向觀察坐標系,x軸和z軸的旋轉情況如圖:

空間坐標系繞z軸的旋轉方向如圖:

從z軸正方向朝負方向觀察坐標系,x軸和y軸的旋轉情況如圖:

  • 上一篇:可執行文件的擴展名有哪些,分別是什麽意思?
  • 下一篇:PLC是什麽。由什麽組成的?
  • copyright 2024編程學習大全網