OpenGL學(xué)習(xí)筆記7(OpenGL中的向量压恒、矩陣基礎(chǔ)以及在繪圖時應(yīng)用)

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)用

變換術(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敞葛,一起剝皮案震驚了整個濱河市誉察,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惹谐,老刑警劉巖持偏,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氨肌,居然都是意外死亡鸿秆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門怎囚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卿叽,“玉大人,你說我怎么就攤上這事恳守】加ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵井誉,是天一觀的道長蕉扮。 經(jīng)常有香客問我,道長颗圣,這世上最難降的妖魔是什么喳钟? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮在岂,結(jié)果婚禮上奔则,老公的妹妹穿的比我還像新娘。我一直安慰自己蔽午,他們只是感情好易茬,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般抽莱。 火紅的嫁衣襯著肌膚如雪范抓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天食铐,我揣著相機與錄音匕垫,去河邊找鬼。 笑死虐呻,一個胖子當(dāng)著我的面吹牛象泵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斟叼,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼偶惠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朗涩?” 一聲冷哼從身側(cè)響起忽孽,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馋缅,沒想到半個月后扒腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡萤悴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年瘾腰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片覆履。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋盆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硝全,到底是詐尸還是另有隱情栖雾,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布伟众,位于F島的核電站析藕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凳厢。R本人自食惡果不足惜账胧,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望先紫。 院中可真熱鬧治泥,春花似錦、人聲如沸遮精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至准脂,卻和暖如春劫扒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背意狠。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工粟关, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人环戈。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像澎灸,于是被迫代替她去往敵國和親院塞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容