八坏平、了解OpenGL中的向量拢操、矩陣

向量

了解向量之前,先了解什么是標(biāo)量

  • 標(biāo)量:只有大小舶替,例如:1令境,12,13等
  • 向量是有方向的標(biāo)量顾瞪,即不僅有大小舔庶,還有方向

單位向量
單位向量是長(zhǎng)度為1的向量,向量長(zhǎng)度通過(guò)下列公式計(jì)算

向量的模的計(jì)算

如果一個(gè)向量不是單位向量陈醒,可以通過(guò)單位化將其轉(zhuǎn)化為單位向量惕橙,即 非零向量除以向量的模,如下圖所示


向量單位化

向量點(diǎn)乘

  • 點(diǎn)乘只能發(fā)生在兩個(gè)向量之間钉跷,且點(diǎn)乘時(shí)弥鹦,兩向量必須是單位向量,如果不是爷辙,需要將向量進(jìn)行單位化后彬坏,再點(diǎn)乘
  • 點(diǎn)乘得到的是兩個(gè)向量之間的夾角的余弦值 即 cosα,范圍在[-1, 1]之間犬钢,是一個(gè)標(biāo)量


    向量點(diǎn)乘
  • OpenGL中針對(duì)相應(yīng)點(diǎn)乘苍鲜,提供了兩個(gè)函數(shù)
    • m3dDotProduct3:獲得2個(gè)向量量之間的點(diǎn)乘結(jié)果,即余弦值 = cosα
    • m3dGetAngleBetweenVector3:獲取2個(gè)向量之間夾?的角度玷犹,即α = arccos(余弦值)

向量叉乘

  • 兩個(gè)向量之間叉乘得到結(jié)果同樣是一個(gè)向量混滔,且該向量垂直于兩個(gè)向量所構(gòu)成的平面,

  • 由于結(jié)果與兩向量構(gòu)成平面垂直歹颓,也可以理解為得到的結(jié)果是該平面的法線


    向量叉乘
  • OpenGL中針對(duì)向量叉乘也提供了對(duì)應(yīng)的API

    • m3dCrossProduct3:獲得2個(gè)向量之間的叉乘結(jié)果得到一個(gè)新的向量

OpenGL中向量

  • 向量的表示:有兩種方式坯屿,三維和四維,如圖所示
math3d庫(kù)中的數(shù)據(jù)類型 說(shuō)明
M3DVector3f 表示?一個(gè)三維向量量(x,y,z)
M3DVector4f 表示?一個(gè)四維向量量(x,y,z,w) w是縮放因子巍扛,在典型情況下领跛,w一般設(shè)置為1.0,x撤奸、y吠昭、z值通過(guò)除以w,來(lái)進(jìn)行縮放胧瓜,當(dāng)w=1.0時(shí)矢棚,想xyz的值本質(zhì)上不會(huì)發(fā)生變化
  • 關(guān)于向量點(diǎn)乘和叉乘對(duì)應(yīng)API匯總


    OpenGL中向量的API

矩陣

單位矩陣

  • 主對(duì)角線上數(shù)據(jù)都是1,其余元素都是0府喳,即為單元矩陣
  • 向量 X 單元矩陣 = 向量 X 1蒲肋,不會(huì)發(fā)生任何變化
  • 向量與單元矩陣相乘的前提是:向量的列數(shù) == 單元矩陣的行數(shù)

矩陣分類

  • 行優(yōu)先矩陣:一行一行讀取
  • 列優(yōu)先矩陣:一列一列讀取
  • 兩者的關(guān)系為:行優(yōu)先矩陣經(jīng)過(guò)轉(zhuǎn)置 即可的到列優(yōu)先矩陣
矩陣分類

矩陣的點(diǎn)乘

  • 矩陣可以進(jìn)行點(diǎn)乘的前提:兩個(gè)矩陣的行列數(shù)相等
  • 矩陣A · 矩陣B = 矩陣C
    -規(guī)則: 矩陣A的第一個(gè)元素與矩陣B的第一個(gè)元素的乘積 = 矩陣C的第一個(gè)元素


    矩陣點(diǎn)乘

矩陣的叉乘

  • 矩陣可以進(jìn)行叉乘的前提:第一個(gè)矩陣的列數(shù) = 第二個(gè)矩陣的行數(shù)
  • 矩陣A X 矩陣B = 矩陣C
    • 規(guī)則:矩陣A第一行與矩陣B第一列對(duì)應(yīng)元素乘積的綜合 = 矩陣C的第一個(gè)元素


      矩陣叉乘

OpenGL中的矩陣

  • OpenGL中單元矩陣有3中初始化方法
    • 通過(guò)GLFloat定義一個(gè)一維數(shù)組

      矩陣初始化方式1

    • 通過(guò)M3DMatrix44f創(chuàng)建一個(gè)單元矩陣

      單元矩陣初始化方式2

- 通過(guò)方法`m3dLoadIdentity44f`創(chuàng)建單元矩陣
void m3dLoadIdentity44f(M3DMatrix44f m);
  • OpenGL中,使用較多的矩陣都是一維數(shù)組創(chuàng)建的,且規(guī)定使用以列為主的矩陣排序兜粘。
  • OpenGL中的矩陣都是4x4的申窘,每一列都是由4個(gè)元素組成的向量,如圖所示
    • 第一列表示x軸方向
    • 第二列表示y軸方向
    • 第三列表示z軸方向
    • 第四列表示交換位置
    • 列向量進(jìn)行了特殊的標(biāo)注孔轴,表示這是以列為主的矩陣剃法,主要體現(xiàn)為矩陣的最后一行都是0,只有最后一個(gè)元素為1
OpenGL中的4X4矩陣

理解OpenGL中的矩陣相乘

數(shù)學(xué)角度

  • 數(shù)學(xué)中為了方便計(jì)算距糖,都是以行矩陣為標(biāo)準(zhǔn)玄窝,從左到右的順序進(jìn)行計(jì)算,所以在數(shù)學(xué)中悍引,頂點(diǎn)將以行向量的方式表示
  • 從數(shù)學(xué)角度理解mvp矩陣的計(jì)算恩脂,由于頂點(diǎn)是行向量,要滿足矩陣相乘的規(guī)定條件(即 叉乘的前提)趣斤,必須將mvp矩陣放在右邊俩块,屬于右乘
    • 頂點(diǎn)向量 = V_local * M_model * M_view * M_pro
    • 頂點(diǎn)向量 = 頂點(diǎn) * 模型矩陣 * 觀察矩陣 * 投影矩陣


      數(shù)學(xué)角度

OpenGL角度

  • OpenGL中的矩陣規(guī)定是以列為主,所以頂點(diǎn)以列向量的方式表示
  • 從OpenGL角度理解mvp矩陣的計(jì)算浓领,由于頂點(diǎn)是列向量玉凯,如果項(xiàng)進(jìn)行矩陣規(guī)則,就需要滿足矩陣相乘的條件联贩,需要將mvp矩陣的順序顛倒為pvm漫仆,且放在列向量的左邊,屬于左乘


    OpenGL角度

OpenGL矩陣堆棧中矩陣相乘源碼分析
從OpenGL矩陣堆棧中矩陣相乘源碼分析泪幌,主要有以下3步
-從棧頂獲取棧頂矩陣盲厌,復(fù)制到mTemp

  • 將棧頂矩陣 mTemp 左乘 mMatrix
  • 將結(jié)果放回棧頂,覆蓋棧頂矩陣


    矩陣相乘源碼

而我們?cè)谟^察者不動(dòng)祸泪、物體動(dòng)的觀察方式中吗浩,根據(jù)之前Demo代碼可知


代碼中矩陣堆棧變化
  • ChangeSize函數(shù)中,得到投影矩陣没隘,將投影矩陣壓入投影矩陣堆棧棧頂懂扼,并與模型視圖矩陣棧頂相乘,將結(jié)果覆蓋棧頂右蒲,即 投影矩陣 * 單元矩陣 = 投影矩陣
  • RenderScene函數(shù)中阀湿,將棧頂矩陣copy一份,然后將觀察者矩陣與模型視圖矩陣堆棧棧頂相乘瑰妄,其結(jié)果覆蓋棧頂矩陣陷嘴,即投影矩陣 * 視圖矩陣 = 視圖投影矩陣
  • 得到模型矩陣,將模型矩陣與棧頂矩陣相乘翰撑,其結(jié)果覆蓋棧頂矩陣罩旋,即 棧頂 = 模型視圖投影矩陣

上述代碼,矩陣堆棧的變化過(guò)程如下


堆棧變化過(guò)程

由此可知眶诈,在實(shí)際的代碼中涨醋,mvp矩陣的計(jì)算順序是pvm,最后再將mvp矩陣與頂點(diǎn)矩陣相乘逝撬,得到物體變換后的頂點(diǎn)和位置浴骂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宪潮,隨后出現(xiàn)的幾起案子溯警,更是在濱河造成了極大的恐慌,老刑警劉巖狡相,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梯轻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尽棕,警方通過(guò)查閱死者的電腦和手機(jī)喳挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)滔悉,“玉大人伊诵,你說(shuō)我怎么就攤上這事』毓伲” “怎么了曹宴?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)歉提。 經(jīng)常有香客問(wèn)我笛坦,道長(zhǎng),這世上最難降的妖魔是什么唯袄? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任弯屈,我火速辦了婚禮,結(jié)果婚禮上恋拷,老公的妹妹穿的比我還像新娘资厉。我一直安慰自己,他們只是感情好蔬顾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布宴偿。 她就那樣靜靜地躺著,像睡著了一般诀豁。 火紅的嫁衣襯著肌膚如雪窄刘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天舷胜,我揣著相機(jī)與錄音娩践,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翻伺,可吹牛的內(nèi)容都是我干的材泄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼吨岭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拉宗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辣辫,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旦事,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后急灭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姐浮,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年葬馋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了单料。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡点楼,死狀恐怖扫尖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掠廓,我是刑警寧澤换怖,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蟀瞧,受9級(jí)特大地震影響沉颂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悦污,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一铸屉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧切端,春花似錦彻坛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至茵瀑,卻和暖如春间驮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背马昨。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工竞帽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛施,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓屹篓,卻偏偏與公主長(zhǎng)得像煮嫌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抱虐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344