向量
在高中時期,其實大家就已經(jīng)學過向量的相關(guān)知識了,這兒我們再復習一遍。
什么是向量?
在數(shù)學中,向量(也稱為歐幾里得向量、幾何向量、矢量),指具有大小(magnitude)和方向的量。
在 3D 笛卡爾坐標系, 基本上一個頂點就是XYZ坐標空間上的?一個位置. ?而在空間中給定的一個位置恰恰是由?個單獨的XYZ定義的而這這樣的XYZ就是向量。

向量長度計算
向量長度通過下列公式計算:

單位向量
單位向量是長度為1的向量。
如果一個向量不是單位向量,可以通過單位化將其轉(zhuǎn)化為單位向量,即非零向量除以向量的模。

向量點乘
- 向量點乘只能發(fā)生在兩個向量之間,且點乘時,兩向量必須是單位向量,如果不是,需要將向量進行單位化后,再點乘
-
點乘得到的是兩個向量之間的夾角的余弦值 即 cosα,范圍在[-1, 1]之間,是一個標量
image.png - OpenGL中提供了關(guān)于向量點乘的API:
// m3dDotProduct3 函數(shù)獲得2個向量量之間的點乘結(jié)果;
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
// m3dGetAngleBetweenVector3 即可獲取2個向量之間夾?角的弧度值;
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
向量叉乘
- 兩個向量之間叉乘得到結(jié)果同樣是一個向量,且該向量垂直于兩個向量所構(gòu)成的平面
-
由于結(jié)果與兩向量構(gòu)成平面垂直,也可以理解為得到的結(jié)果是該平面的法線
image.png - OpenGL中提供了關(guān)于向量叉乘的API:
// m3dCrossProduct3 函數(shù)獲得2個向量量之間的叉乘結(jié)果得到一個新的向量量
void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
矩陣
假設(shè),在空間有?個點,使?xyz描述它的位置。此時讓其圍繞任意位置旋轉(zhuǎn)?定?度后,我們需要知道這個點的新的位置,此時需要通過矩陣進?計算。因為新的位置的不單單與原來的位置有關(guān),還和旋轉(zhuǎn)的參數(shù)有關(guān)。
矩陣分類
- 行矩陣:一行一行讀取
- 列矩陣:一列一列讀取
單元矩陣

- 主對角線上數(shù)據(jù)都是1,其余元素都是0,即為單元矩陣
- 向量 X 單元矩陣 = 向量 X 1,不會發(fā)生任何變化
- 向量與單元矩陣相乘的前提是:向量的列數(shù) == 單元矩陣的行數(shù)
矩陣點乘
- 矩陣可以進行點乘的前提:兩個矩陣的行列數(shù)相等
- 矩陣A · 矩陣B = 矩陣C
-
規(guī)則: 矩陣A的第一個元素與矩陣B的第一個元素的乘積 = 矩陣C的第一個元素
圖片來源于網(wǎng)絡(luò)
矩陣叉乘
- 矩陣可以進行叉乘的前提:第一個矩陣的列數(shù) = 第二個矩陣的行數(shù)
- 矩陣A X 矩陣B = 矩陣C
- 規(guī)則:矩陣A第一行與矩陣B第一列對應元素乘積的綜合 = 矩陣C的第一個元素

OpenGL中的矩陣
- 通過
GLFloat定義一個一維數(shù)組
image.png
通過M3DMatrix44f創(chuàng)建一個單元矩陣
image.png - 通過方法
m3dLoadIdentity44f創(chuàng)建單元矩陣
void m3dLoadIdentity44f(M3DMatrix44f m);
矩陣圖解
- OpenGL中,使用較多的矩陣都是一維數(shù)組創(chuàng)建的,且規(guī)定使用以列為主的矩陣排序
-
OpenGL中的矩陣都是4x4的,每一列都是由4個元素組成的向量
1、第一列表示x軸方向
2、第二列表示y軸方向
3、第三列表示z軸方向
4、第四列表示交換位置
5、列向量進行了特殊的標注,表示這是以列為主的矩陣,主要體現(xiàn)為矩陣的最后一行都是0,只有最后一個元素為1
image.png
矩陣相乘
數(shù)學角度中的矩陣相乘
數(shù)學中為了方便計算,都是以行矩陣為標準,從左到右的順序進行計算,所以在數(shù)學中,頂點將以行向量的方式表示
從數(shù)學角度理解mvp矩陣的計算,由于頂點是行向量,要滿足矩陣相乘的規(guī)定條件(即 叉乘的前提),必須將mvp矩陣放在右邊
- 變換后頂點向量 = V_local * M_model * M_view * M_pro
-
變換后頂點向量 = 頂點 * 模型矩陣 * 觀察矩陣 * 投影矩陣
圖片來源于網(wǎng)絡(luò)
OpenGL角度中的矩陣相乘
OpenGL中的矩陣規(guī)定是以列為主,所以頂點以列向量的方式表示
從OpenGL角度理解mvp矩陣的計算,由于頂點是列向量,如果項進行矩陣規(guī)則,就需要滿足矩陣相乘的條件,需要將mvp矩陣的順序顛倒為pvm
- 變換頂點向量量 = M_pro * M_view * M_model * V_local
-
變換頂點向量量 = 投影矩陣 * 視圖變換矩陣 * 模型矩陣 * 頂點
圖片來源于網(wǎng)絡(luò)
OpenGL矩陣堆棧中矩陣相乘源碼分析
1
- 從棧頂獲取棧頂矩陣 復制到 mTemp
- 將棧頂矩陣 mTemp 左乘 mMatrix
- 將結(jié)果放回棧頂空間?里里

2.








