1.OpenGL向量以及矩陣
1.2 向量的作用以及表示
在GLTools庫中有一個組件叫Math3d茅主,其中包含了大量好用的OpenGL一致的3D數(shù)學(xué)和數(shù)據(jù)類型纵刘。雖然我們不必要親自進行所有的矩陣和向量的操作穴翩,但我們需要知道它們是什么犬第?以及如何運用它們,在開發(fā)工程中我們涉及到的圖形變換芒帕,就會涉及到矩陣歉嗓、向量的計算。
2.2 如何在代碼中表示一個向量
在math3d庫中哮幢,給我們提供了兩種數(shù)據(jù)類型,能夠表示一個三維或者四維向量:
- M3DVector3f:表示一個三維向量(x, y, z)志珍。
- M3DVector4f:表示 一個四維向量(x, y, z, w)橙垢,其中w為縮放因子,一般情況下值設(shè)置為1.0伦糯,x, y, z值通過除以w來進行縮放柜某。而除以1.0本質(zhì)上不會改變x, y, z的值。
typedef float M3DVector3f[3];
typedef float M3DVector4f[4];
//聲明一個三維向量操作
M3DVector3f vVector3;
//聲明一個四維向量操作
M3DVector4f vVector4 = {0.0f, 0.0f, 0.0f, 1.0f };
聲明一個三維向量頂點數(shù)組舔株,例如生成一個三角形
M3DVector3f vVerts[] = {
-0.5f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f };
2.3 向量/矩陣 的點乘
-
點乘的概念:又叫做點積莺琳、內(nèi)積、數(shù)量積载慈、標(biāo)量積惭等,向量a[a1,a2,...,an]和向量b[b1,b2b...,bn]點乘的結(jié)果是一個標(biāo)量,記作a.b办铡,如下圖所示:
向量的點乘公式 -
OpenGL中的向量點乘
如下圖:
OpenGL中向量的點乘
向量點乘的方法實現(xiàn):
//方法1:返回-1到1之間的值辞做。它代表傳入兩個向量的余弦值。
float m3dDotProduct3(const M3DVector3f u, const M3DVector3f v);
//方法2:返回兩個向量的弧度值寡具。
float m3dGetAngleBetweenVector3(const M3DVector3f u, const M3DVector3f v);
2.4 向量/矩陣的叉乘
-
叉乘的概念:又叫向量積秤茅、外積、叉積童叠,叉乘框喳,向量a[x1,y1,z1]和向量b[x2,y2,z2]叉乘的運算結(jié)果是一個向量,并且兩個向量的叉積與這兩個向量組成的坐標(biāo)平面垂直厦坛,記作axb五垮;
向量的叉乘公式 -
OpenGL中的向量叉乘:
如下圖:
OpenGL中向量的叉乘.jpeg
向量叉乘的方法實現(xiàn):
//參數(shù)1:叉乘計算結(jié)果向量,參數(shù)2和參數(shù)3是要進行叉乘的兩個向量杜秸。
void m3dCrossProduct3(M3DVector3f result, const M3DVector3f u, const M3DVecror3f v);
注意:矩陣U叉乘矩陣V與矩陣V叉乘矩陣U結(jié)果是不相同的放仗,矩陣的叉乘不能進行逆運算。
2.5 OpenGL中的矩陣
2.5.1 矩陣的運算
-
如果?個向量乘以?個單位矩陣得到的結(jié)果還是原來的矩陣撬碟,如下圖:
2.5.2 OpenGl中的矩陣表示
-
?個4x4的矩陣在3D空間中的表示位置以及方向的方式诞挨,如下圖所示:
4x4矩陣在3D空間的位置與方向表示
注意:矩陣的最后??都為0,只有最后?個元素為1
-
以下分別表示三種矩陣
三種矩陣 OpenGL定義矩陣的類型
//定義一個3行3列的矩陣
typedef float M3DMatrix33f[9];
//定義一個4行4列的矩陣
typedef float M3DMatrix44f[16];
//創(chuàng)建單元矩陣
GLfloat m44f[] = {
1.0f,0.0f,0.0f,0.0f,//X列
0.0f,1.0f,0.0f,0.0f,//Y列
0.0f,0.0f,1.0f,0.0f,//Z列
0.0f,0.0f,0.0f,1.0f//變換
};
//使用方法初始化一個3x3的單元矩陣
M3DMatrix33f m33;
m3dLoadIdentity33(m33);
//初始化4x4的單元矩陣
M3DMatrix44f m44 = {
1.0f, 0.0f, 0.0f, 0.0f, //x列
0.0f, 1.0f, 0.0f, 0.0f, //y列
0.0f, 0.0f, 0.1f, 0.0f, //z列
0.0f, 0.0f, 0.0f, 1.0f //變換
};
由以上代碼可知:在OpenGL的矩陣構(gòu)造是一維數(shù)組呢蛤,而不是二維數(shù)組惶傻,因為使用一維數(shù)組效率高,一個一個讀取就可以了其障。
2.5.3 行矩陣與列矩陣
轉(zhuǎn)置矩陣:將?矩陣A的換成同序列列得到的矩陣达罗,叫做A的轉(zhuǎn)換矩陣。計為AT。矩陣轉(zhuǎn)置粮揉,其實就是?列互換。有很多地?都?到抚笔。?如數(shù)學(xué)扶认、程序語?、計算機數(shù)據(jù)結(jié)構(gòu)中殊橙。
2 繪制圖形時對向量\矩陣的應(yīng)用
2.1 OpenGL變換術(shù)語應(yīng)用
2.2 OpenGL中的仿射變換
2.2.1 平移變換
-
模型的平移
圖示:
模型的平移 矩陣的平移
/// 矩陣的平移
/// @param m 平移后的矩陣
/// @param x x軸平移距離
/// @param y y軸平移距離
/// @param z z軸平移距離
void m3dTranslationMatrix44(float *m, float x, float y, float z);
2.2.2 旋轉(zhuǎn)變換
-
模型的旋轉(zhuǎn)
圖示:
模型圍繞任意軸旋轉(zhuǎn) 矩陣的旋轉(zhuǎn)
/// 矩陣的旋轉(zhuǎn)
/// @param m 旋轉(zhuǎn)后的矩陣
/// @param angle 旋轉(zhuǎn)的弧度值辐宾,如果想要傳入角度,可以使用m3dDegToRad(度數(shù)值)函數(shù)將度數(shù)轉(zhuǎn)化為弧度值
/// @param x 圍繞x軸旋轉(zhuǎn)傳入1.0膨蛮,否則傳入0.0
/// @param y 圍繞y軸旋轉(zhuǎn)傳入1.0叠纹,否則傳入0.0
/// @param z 圍繞z軸旋轉(zhuǎn)傳入1.0,否則傳入0.0
void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z); //4x4矩陣的旋轉(zhuǎn)
void m3dRotationMatrix33(M3DMatrix33f m, float angle, float x, float y, float z);//3x3的矩陣的旋轉(zhuǎn)
2.2.3 縮放變換
-
模型的縮放
圖示:
模型的縮放 矩陣的縮放
/// 獲取一個矩陣進行旋轉(zhuǎn)變換之后的矩陣
/// @param 旋轉(zhuǎn)之后的矩陣
/// @param xScale x軸縮放因子
/// @param yScale y軸縮放因子
/// @param zScale z軸縮放因子
void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale);//4x4矩陣的旋轉(zhuǎn)
void m3dScaleMatrix33(M3DMatrix33d m, double xScale, double yScale, double zScale)//3x3的矩陣的旋轉(zhuǎn)
/// 獲取一個矩陣進行旋轉(zhuǎn)變換之后的矩陣
/// @param m 旋轉(zhuǎn)之后的矩陣
/// @param vScale 一個包含x,y,z軸縮放因子的M3DVector3f類型變量
void m3dScaleMatrix44(M3DMatrix44f m, const M3DVector3f vScale);//4x4矩陣的旋轉(zhuǎn)
void m3dScaleMatrix33(M3DMatrix33d m, const M3DVector3d vScale);//3x3的矩陣的旋轉(zhuǎn)