OpenGL ES系列一--向量和矩陣

OpenGL ES之向量、矩陣

OpenGL ES是一個很強大的庫,可以繪製各種酷炫的3D圖形,既然涉及到3D圖形,那麼跟3D數學肯定是脫離不了關係的,在我們正式進行OpenGL ES之前,我們需要先搞清楚一些數學上的東西,這樣在你後面進一步學習OpenGL ES的時候才不至於懵逼。主要涉及到的一些數學概念有:

  1. 向量
    • 向量的定義
    • 向量的加法、減法
    • 向量的乘法(數乘、點乘、叉乘)
  2. 矩陣
    • 矩陣的定義
    • 矩陣的乘法(數乘、乘法、向量和矩陣的乘法)
    • 一些常見的矩陣變換:縮放、投影、平移等(含4維齊次座標的使用)

向量

向量的定義

定義:數學上區分向量(矢量)和標量(數量),標量就是我們平常所用的數字,強調數量值;向量的話其實就是帶有方向的標量,常用有向線段表示。向量根據所在的座標系(平面座標、3D座標、4D座標等),分爲2維座標、3維座標等,依次類推

向量的大小就是向量的長度(模),長度非負。計算方式爲向量各分量的平方之和開平方,比如二維向量二維向量a](C:\Users\cpMark\Desktop\CSDN文章\OPenGL ES\參考圖\二維向量a.jpg),那麼它的模爲![img

​ 向量的方向描述了空間中向量的指向。箭頭是向量的末端(向量“結束”於此),箭尾是向量的“開始”

日常生活中很多量都有大小和方向,比如:位移(向前三步,由大小三步和方向向前構成)、速度(我們以50公里每小時的速度向北行駛,由大小50公里每小時和方向北構成),注意位移和速度與距離、速率是完全不同的,前兩者爲向量,後兩者爲標量。

一些常用的向量類型:

類型名 定義
法向量 垂直於平面的直線所表示的向量爲該平面的法向量。由於空間內有無數個直線垂直於已知平面,因此一個平面都存在無數個法向量
標準化向量(法線) 向量大小爲1的向量稱爲單位向量,單位向量經常也被稱作標準化向量或更簡單地秤爲法線。對於任意非零向量v,都能計算出一個和v方向相同的單位向量,這個過程被稱作向量的“標準化”,要標準化向量,將向量除以它的大小(模)即可。(零向量不能標準化)

OpenGL ES在求光照的時候會用到法向量和標準化向量,具體的我們在涉及到光照的知識的地方會說明。

向量的加法和減法

向量加法的運算法則:兩個向量相加,將對應的分量相加即可(前提條件:兩個向量的維數相同)。

a=(x1,y1),b=(x2,y2),則a+b=(x1+x2,y1+y2)

向量減法的運算法則:向量減法解釋爲加負向量(條件同上)

a=(x1,y1),b=(x2,y2) ,則a-b=(x1-x2,y1-y2).

注意:

  1. 向量不能與標量或者維數不同的向量相加減
  2. 向量加法滿足交換律,但是向量減法不滿足交換律

補充知識點:在OpenGL ES中,顏色、紋理、光照等都是使用向量來表示的,以顏色爲例:

//這是一段GLSL着色器程序,其很多語法和c++相似。vec4表示4維向量
//在此處vec4的4個分量分別是r、g、b、a
vec4 colorA;
vec4 colorB;
void main(){
    //這是GLSL的內置函數,爲片元設置顏色,這裏就使用到了向量相加(各對應的分量相加)
    gl_FragColor = colorA +colorB;
}

向量的乘法

數乘(標量和向量的乘法)

標量和向量不能相加,但它們能相乘,將得到一個與原向量平行,但長度不同或方向相反的向量。

標量與向量的乘法滿足交互律,將向量的每個分量都與標量相乘即可。向量也能除以非零標量,效果等同於乘以標量的倒數

注意:標量不能除以向量,並且向量不能除以另一個向量

向量點乘

向量點乘,也稱內積,是對應分量乘積的和,結果是一個標量,其結果也等於向量大小與向量夾角的cos值的積,示例如下。滿足交換律

設向量:

a(x1, y1, z1) b(x2,y2,z2)

所以點乘結果爲:

a · b = |a||b|cos<a, b>

a · b = x1*x2 + y1*y2 + z1*z2

意義:一般來說,點乘結果描述了兩個向量的相似程度,結果越大,兩向量越相近。

向量叉乘

向量叉乘,也稱叉積,僅可應用於3D向量,結果是一個垂直於原來兩個向量的向量,可以理解爲法向量。需要注意的是不滿足交換律

叉乘的長度等於向量的大小與向量夾角的sin值的積

設向量:

a(x1, y1, z1) b(x2,y2,z2)

叉乘結果爲向量:

a X b = (y1*z2 – z1*y2, z1*x2 – x1*z2, x1*y2 – y1*x2)

叉乘結果的長度:

a**X**b∣=|a|·|b|·sin〈ab〉,sin〈ab〉爲向量ab的夾角

矩陣

矩陣的定義

定義:矩陣是3D數學的重要基礎,常用來描述兩個座標系統間的關係,通過定義一種運算而將一個座標系中的向量轉換到另一個座標系中

矩陣類型 說明
方陣 行數和列數相同的矩陣稱作方陣,方陣的對角線元素就是方陣中行號和列號相同的元素,其他均爲非對角線元素。
單位矩陣 非對角線元素都爲0,對角線元素全爲1的特殊方陣爲單位矩陣。單位矩陣是矩陣的乘法單位元,任意一個矩陣乘以單位矩陣,得到的還是原矩陣
向量 向量可以理解爲特殊的矩陣,怎麼特殊呢?如果矩陣的行數,或者列數爲1,那麼矩陣就成了向量,1xn矩陣稱作行向量,nx1矩陣稱作列向量

矩陣乘法

矩陣乘法包含數乘、乘法、向量乘矩陣,具體如下:

數乘

當標量乘以矩陣時,以標量乘以矩陣中的各分量,示例如下圖:

img

乘法

矩陣能夠相乘的前提條件:設當前有兩個矩陣A、B,矩陣A的列數要和矩陣B的行數相同,其結果爲一個A的行數,B的列數的矩陣AB。

rxn矩陣A與nxc矩陣B的積 rxc矩陣AB爲C,C中的任意元素等於A的對應行向量與B的對應列向量的點乘結果。示例如下:

img

注意:

  1. 矩陣乘法不滿足交換律
  2. 矩陣乘法滿足結合律
  3. 矩陣乘法滿足與標量或向量的結合律

在OpenGL ES中我們經常將多個變換矩陣先乘,結合成一個總變換矩陣再傳給着色器使用

向量和矩陣的乘法(向量其實是特殊矩陣,所以只有滿足矩陣乘法的向量*矩陣纔有意義)

行向量左乘矩陣時,結果是行向量;右乘無意義;列向量右乘矩陣時,結果是列向量;左乘無意義。以下爲列向量右乘矩陣的示例:

這裏寫圖片描述

由上面的示例可以看出,當原列向量右乘矩陣之後,原列向量的x、y、z發生變化,都乘以一個係數,可以理解爲向量乘以矩陣之後所得到的新向量經過矩陣的線性變換的

一些常見的矩陣變換:縮放、投影、平移等(含4維齊次座標的使用)

縮放

在各個方向應用同比例的縮放,並且沿着原點“膨脹”物體,那麼就是均勻縮放,均勻縮放可以保持物體的角度和比例不變。如果長度增加或減少因子k,則2D增加或減小因子k的平方,在3D中,體積的因子是k的立方,一次類推。

如果需要擠壓或拉伸物體,在不同的方向應用不同的因子即可,這稱作非均勻縮放。如果|k|<1,物體將變短;如果|k|>1,物體邊長;如果|k|=0,就是正交投影;如果k<0,就是鏡像。

這裏寫圖片描述

圖中顯示,x、y、z分別乘以三個縮放因子,起到縮放的作者用

旋轉

首先要明確旋轉在二維中是繞着某一個點進行旋轉,三維中是繞着某一個軸進行旋轉。我們這裏以2維爲例,如下圖所示:

這裏寫圖片描述

如圖所示點v 繞 原點旋轉θ 角,得到點v’,假設 v點的座標是(x, y) ,那麼可以推導得到 v’點的座標(x’, y’)(設原點到v的距離是r,原點到v點的向量與x軸的夾角是ϕ )

//x、y值
x=rcosϕ
y=rsinϕ 

//旋轉過後的x、y值
x′=rcos(θ+ϕ)
y′=rsin(θ+ϕ) 

//通過三角函數展開旋轉結果
x′=rcosθcosϕ−rsinθsinϕ 
y′=rsinθcosϕ+rcosθsinϕ 

//帶入x、y,得到最終結果
x′=xcosθ−ysinθ 
y′=xsinθ+ycosθ 

寫成矩陣的形式是:

這裏寫圖片描述

平移

在計算機圖形學中,爲了統一將平移、旋轉、縮放等用矩陣表示,需要引入齊次座標。(假設使用2x2的矩陣,是沒有辦法描述平移操作的,只有引入3x3矩陣形式,才能統一描述二維中的平移、旋轉、縮放操作。同理必須使用4x4的矩陣才能統一描述三維的變換)。我們這裏以三維變換爲例,如下圖爲平移的一種矩陣形式:

這裏寫圖片描述

變換的組合

變換是由矩陣來實現的,所以變換的組合實際上就是矩陣的組合,從代數角度來看是利用了矩陣乘法的結合律。我們以二維旋轉爲例(旋轉點是不過原點的,所以此旋轉是旋轉和平移的組合),二維旋轉以點爲旋轉中心,此時我們需要執行以下步驟:

  1. 將旋轉點一到原點
  2. 繞原點旋轉
  3. 再將旋轉點移回原來的位置

從上面可以看出經過了兩次平移、一次旋轉。具體的矩陣變換如下圖:

這裏寫圖片描述

從上面可以看出變換組合實際上就是組合各種變換矩陣,從而得到一個最終變換矩陣即可。

正交投影

​ 投影意味着降維操作。有一種投影方法是在某個方向上用零作爲縮放因子,這種情況下,所有點都被拉平至垂直的軸(2D)或平面(3D)上,這種類型的投影稱作正交投影,或者平行投影,因爲從原來的點到投影點的直線相互平行

透視投影

​ 透視投影的投影線不在是平行的,它們相交於一點,該點稱作投影中心。因爲投影中心在投影平面前面,投影線到達平面之前已經相交,所以投影平面上的圖像是翻轉的。當物體遠離投影中心時,正交投影任保持不變,但透視投影變小

參考文章:

旋轉變換(一)旋轉矩陣

發佈了44 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章