向量
- 數(shù)學(xué)中:形象的用一個(gè)帶有箭頭的線段指代向量,線段長(zhǎng)度表示向量的大小,箭頭所指方向?yàn)橄蛄康姆较?。所以說向量我們可以理解為一個(gè)同時(shí)具有大小和方向的量。
- OpenGL:在 3D 笛卡爾坐標(biāo)系中的?個(gè)頂點(diǎn),也就是由XYZ三個(gè)值構(gòu)成一個(gè)值就是向量。
- 單位向量:向量長(zhǎng)度為1的向量,向量的長(zhǎng)度也叫向量的模。
- 單位化向量:如果?個(gè)向量不是單位向量, ?我們把它縮放到1的過程(只保留方向)。

OpenGL[math3d]對(duì)于向量的定義
math3d庫中存在2種數(shù)據(jù)類型,分別表示三維和四維向量。
M3DVector3f表示?個(gè)三維向量(x, y, z)
M3DVector4f表示?個(gè)四維向量(x, y, z, w)
典型情況下w坐標(biāo)設(shè)為1.0,x,y,z值通過除以w來進(jìn)?縮放,?除以 1.0則本質(zhì)上不改。
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
//聲明一個(gè)三分量向量操作:
M3DVector3f vVector3;
//聲明一個(gè)四分量的操作:
M3DVector4f vVector4 = {0.0f,0.0f,1.0f,1.0f};
//聲明一個(gè)三分量頂點(diǎn)數(shù)組,例如生成一個(gè)三角形
M3DVector3f vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f
};
向量的點(diǎn)乘和叉乘
點(diǎn)乘
2個(gè)向量進(jìn)行點(diǎn)乘后會(huì)得到一個(gè)標(biāo)量,具體計(jì)算公式我們可以不需要細(xì)究,但我們要知道點(diǎn)乘后通過一些計(jì)算我們可以得到兩個(gè)向量的夾角值。

//實(shí)現(xiàn)點(diǎn)乘方法:
// 方法1:返回的是-1,1之間的值。它代表這個(gè)2個(gè)向量的余弦值。
float m3dDotProduct3(const M3DVector3f u,const M3DVector3f v);
//方法2:返回2個(gè)向量之間的弧度值。
float m3dGetAngleBetweenVector3(const M3DVector3f u,const M3DVector3f v);
叉乘
2個(gè)向量進(jìn)行叉乘可以得到另外?個(gè)向量,新的向量會(huì)與原來2個(gè)向量定義的平?垂直(法線)。

void m3dCrossProduct3(M3DVector3f result,const M3DVector3f u ,const M3DVector3f v);
矩陣
簡(jiǎn)單來說矩陣就是一個(gè)矩形的數(shù)字、符號(hào)或表達(dá)式數(shù)組。矩陣中每一項(xiàng)叫做矩陣的元素。
OpenGL中使用一維數(shù)組來表示一個(gè)矩陣(約定試用列優(yōu)先矩陣)。
列向量進(jìn)?了特別的標(biāo)注:矩陣的最后??都為0,只有最后?個(gè)元素為1。
三維矩陣/四維矩陣的聲明
typedef float M3DMatrix33f[9];
typedef float M3DMatrix44f[16];
矩陣相乘
實(shí)際上矩陣相乘的結(jié)果矩陣的第1個(gè)元素就是第一行乘以第一列每個(gè)元素積的和。
相乘還有一些限制:
- 只有當(dāng)左側(cè)矩陣的列數(shù)與右側(cè)矩陣的行數(shù)相等,兩個(gè)矩陣才能相乘。
- 矩陣相乘不遵守交換律(Commutative),也就是說AB≠BA。

矩陣相乘
單位矩陣:
- 實(shí)際上就是一個(gè)斜對(duì)角全是1,其他都是0的矩陣。