OpenGL入門(mén)(八)-- OpenGL向量和矩陣簡(jiǎn)介

在前面,我們對(duì)OpenGL中繪圖做了簡(jiǎn)單的介紹,還想繼續(xù)深入OpenGL的后面的內(nèi)容,就需要熟悉OpenGL中涉及到的數(shù)學(xué)知識(shí),因此,本篇文章主要介紹OpenGL中的基本數(shù)學(xué)。(原博主鏈接:https://blog.csdn.net/wangdingqiaoit/article/details/51383052

向量的概念

向量是研究2D、3D數(shù)學(xué)的標(biāo)準(zhǔn)工具。向量V是一個(gè)既有大小又有方向的量(聯(lián)系位移和速度的概念)。在數(shù)學(xué)上,常用一條有方向的線段來(lái)表示向量。例如下圖n維空間的向量v=AB→=(v1,v2,...,vn)v=AB→=(v1,v2,...,vn)如下圖所示,向量起點(diǎn)為A,終點(diǎn)為B:


image

注意:

  • 向量的大小就是向量的長(zhǎng)度(模),向量的長(zhǎng)度是非負(fù)的;
  • 向量的方向描述了向量的指向;
  • 向量是沒(méi)有位置的,與點(diǎn)是不同的;
  • 向量與標(biāo)量不同,變量是只有大小而沒(méi)有方向的量,例如位移是向量,而距離是標(biāo)量;

零向量與單位向量

向量的長(zhǎng)度即模,定義為:


屏幕快照 2019-05-20 14.04.40.png

模等于0的向量成為0向量,模等于1的向量叫做單位向量。注意零向量的方向是任意的。
由一個(gè)向量v求與它同方向的單位向量過(guò)程稱(chēng)為標(biāo)準(zhǔn)化(normalization),這個(gè)單位向量成為標(biāo)準(zhǔn)化向量(normalized vector)。計(jì)算過(guò)程為:


屏幕快照 2019-05-20 14.05.28.png

三角形法則和平行四邊形法則

兩個(gè)向量a和b,當(dāng)將b的起點(diǎn)放在a的終點(diǎn),連接a的起點(diǎn)和b的終點(diǎn)的向量成為向量a,b之和,記為:c=a+b,如下圖所示:


image

物理上力學(xué)求和經(jīng)常使用平行四邊形法則,表達(dá)的是向量加法運(yùn)算的結(jié)合律,即:a+b=b+a,如下圖所示:


image

與一個(gè)向量a大小相同,方向相反的向量,稱(chēng)為向量a的負(fù)向量,兩者相加得到零向量,即:
a+(?a)=0

向量夾角

兩個(gè)非零向量的夾角規(guī)定為不超過(guò)π的角度θ,即:0≤θ≤π,如下圖所示:


image

注意這個(gè)夾角的范圍。當(dāng)θ=π/2稱(chēng)兩個(gè)向量a與b垂直,當(dāng)θ=0或者π時(shí),稱(chēng)向量a與b平行。

向量點(diǎn)積

向量點(diǎn)積,也稱(chēng)為向量的數(shù)量積,點(diǎn)積的結(jié)果是一個(gè)標(biāo)量,其定義為: A.B=|A||B|cosθ,其中θ表示向量A和B之間的夾角。

向量點(diǎn)積的幾何意義

要理解點(diǎn)積的幾何意義,首先了解概念向量在軸上的投影(scalar projection ),這個(gè)投影計(jì)算得到一個(gè)標(biāo)量。向量A在B上的投影定義為: AB=|A|cosθ。如下圖所示:


image

則可以寫(xiě)為: A.B=|A|BA=|B|AB。
在空間幾何中,例如n空間中,向量的坐標(biāo)表示為: A=(a1,b2,?,cn) ,B=(b1,b2,?,bn), 則兩個(gè)向量的點(diǎn)積可以表示為:


屏幕快照 2019-05-20 14.12.41.png

向量點(diǎn)積的應(yīng)用

向量點(diǎn)積的一個(gè)重要應(yīng)用在于,可以快速求出兩個(gè)向量的夾角余弦。
兩個(gè)向量的夾角余弦計(jì)算公式為:


屏幕快照 2019-05-20 14.13.55.png

當(dāng)a和b都是單位向量時(shí),兩單位向量的夾角余弦值為:
cosθ=a.b。
因此,我們能很快的計(jì)算出兩個(gè)單位向量的夾角余弦,在計(jì)算光照時(shí)經(jīng)常使用。
另外當(dāng)一個(gè)向量為單位向量時(shí):


屏幕快照 2019-05-20 14.16.20.png

向量的叉積

兩個(gè)向量a和b的叉積,結(jié)果是一個(gè)向量c=a×b,c的方向垂直于a和b,它需要根據(jù)右手規(guī)則來(lái)確定,c的大小等于:


屏幕快照 2019-05-20 14.17.24.png

叉積如下圖所示:


image

注意c的方向需要根據(jù)右手規(guī)則來(lái)確定。所謂右手規(guī)則是指,將向量a與b放在同一個(gè)起點(diǎn)時(shí),當(dāng)右手的四個(gè)手指從a所指方向轉(zhuǎn)到b所指方向握拳時(shí),大拇指的指向即為a×b的方向。如下圖所示:


image

尤其要注意 a×b≠b×a,事實(shí)上,a×b=?b×a。在利用以坐標(biāo)形式表示向量a和b時(shí),在3D空間中,叉積的結(jié)果用矩陣表示為:
屏幕快照 2019-05-20 14.19.18.png

叉積的幾何意義

叉積的模可以視為以a和b為兩邊的平行四邊形的面積,如下圖所示:


image

其中|b|sinθ可以視為平行四邊形的高,計(jì)算后a×b的模即為平行四邊形的面積。

叉積的應(yīng)用

在OpenGL圖形編程中,叉積經(jīng)常在已知兩個(gè)方向時(shí),用來(lái)確定第三個(gè)方向。例如已知相機(jī)的朝向dir和側(cè)向量side,則相機(jī)的頂部向量為: up=dir×side,后面再介紹相機(jī)矩陣時(shí)會(huì)用到。

投影向量的計(jì)算

一個(gè)向量a在另一向量b上的投影向量,包括與b平行的部分a1和與b垂直的部分a2。a1即是之前提到的scalar projection,不過(guò)這里a1是一個(gè)向量。具體過(guò)程如下圖所示:


image

上圖可知與b平行分量a1可計(jì)算為:


屏幕快照 2019-05-20 14.22.52.png

垂直分量a2計(jì)算為:


屏幕快照 2019-05-20 14.22.12.png

投影向量的應(yīng)用

投影向量的計(jì)算過(guò)程,是一個(gè)向量分解的過(guò)程,這種向量分解的思路在后面推導(dǎo)其他內(nèi)容時(shí)很有幫助,例如求解后面的物體旋轉(zhuǎn)矩陣時(shí)會(huì)派上用場(chǎng)。

矩陣的概念

矩陣從形式上就是一個(gè)數(shù)字表,以行和列的形式呈現(xiàn),簡(jiǎn)單的矩陣如下圖所示:


屏幕快照 2019-05-20 14.23.58.png

矩陣的行數(shù)m和列數(shù)n可以不相同,m行n列矩陣記為矩陣Am×n。當(dāng)行數(shù)和列數(shù)相等時(shí),m= n ,矩陣A也稱(chēng)為n階方陣。例如下圖給出了3x4矩陣A3×4的抽象表示:


屏幕快照 2019-05-20 14.24.09.png

行向量和列向量

對(duì)于1xn的矩陣,我們稱(chēng)之為行向量,nx1的矩陣稱(chēng)為列向量。一般可以用列向量表示空間中的向量(以行向量表示也可以),例如上面的向量a=(ax,by,cz)可以用列向量表示為:


屏幕快照 2019-05-20 14.24.20.png

注意:OpenGL編程中習(xí)慣用列向量表示點(diǎn)或者向量。矩陣在內(nèi)存中以列優(yōu)先存儲(chǔ),但是具體傳遞參數(shù)時(shí),一般函數(shù)提供了是否轉(zhuǎn)置的布爾參數(shù)來(lái)調(diào)整存儲(chǔ)格式。例如void glUniformMatrix4fv函數(shù)提供了布爾變量 GLboolean transpose 來(lái)表示是否轉(zhuǎn)置矩陣。

零矩陣和n階單位陣

mxn矩陣,如果所有元素都為0,則成為零矩陣。 對(duì)于一個(gè)n階方陣,如果主對(duì)角線元素全為1,其余元素都為0則稱(chēng)為n階單位陣。對(duì)于一個(gè)矩陣Am×n,存在單位陣滿足:ImA=AIn=A。 任意矩陣Am×n與對(duì)應(yīng)的零矩陣Bn×p相乘得到零矩陣。

矩陣轉(zhuǎn)置

轉(zhuǎn)置操作即是將矩陣的行和列互換,即原矩陣A的第一行變?yōu)檗D(zhuǎn)置矩陣AT的第一列,原矩陣A的第二行變?yōu)檗D(zhuǎn)置矩陣AT的第二列,其他部分依次類(lèi)推。

例如矩陣:
屏幕快照 2019-05-20 14.24.31.png

則其轉(zhuǎn)置矩陣為:


屏幕快照 2019-05-20 14.24.39.png

矩陣的運(yùn)算

矩陣加減法

兩個(gè)矩陣A和B要能執(zhí)行加減法,必須是行和列數(shù)目相等的,計(jì)算過(guò)程,即對(duì)應(yīng)的元素相加(Aij+Bij)或者相減(Aij?Bij),如下圖所示:


image

image

標(biāo)量和矩陣乘法

用一個(gè)數(shù)k乘以矩陣A,結(jié)果為矩陣A中每個(gè)元素乘以數(shù)k。例如:


image

矩陣和矩陣乘法

兩個(gè)矩陣Am×n和Bn×p要執(zhí)行乘法操作,需要滿足: 左邊矩陣的列數(shù)和右邊矩陣的行數(shù)相等,并且結(jié)果矩陣為Cm×p。
計(jì)算過(guò)程如下圖所示:

image

其中
屏幕快照 2019-05-20 15.00.33.png

,即C中第i行第j列的元素,即為矩陣A的第i行和第j的對(duì)應(yīng)元素相乘后的和。例如:
image

注意矩陣乘法不滿足交換律,一般而言矩陣乘積AB≠BA(當(dāng)然存在特殊情況下滿足),因此在OpenGL中應(yīng)用變換矩陣時(shí)注意變換應(yīng)用的順序。變換的例子后面會(huì)介紹。

矩陣和矩陣相乘舉例

給定兩個(gè)矩陣相乘,過(guò)程如下圖所示:


image

image

image

熟悉了矩陣相乘后,則上述向量的點(diǎn)積公式可以重新表示為:


屏幕快照 2019-05-20 15.04.00.png

則兩個(gè)向量的點(diǎn)積可以表示為:


屏幕快照 2019-05-20 15.04.35.png

矩陣不滿足交換律舉例

image

這里AB≠BA,提醒我們注意矩陣相乘時(shí)的順序。

矩陣和向量相乘

矩陣和向量相乘是矩陣和矩陣相乘的特例,給定矩陣A和列向量v,相乘過(guò)程如下所示:


屏幕快照 2019-05-20 15.06.03.png

行列式

行列式是n階方陣的數(shù)字構(gòu)成的數(shù)的行列集合,例如2階方陣A表示為:


屏幕快照 2019-05-20 15.07.40.png

其行列式det(A)表示為:
屏幕快照 2019-05-20 15.07.57.png

3x3矩陣的行列式計(jì)算如下:
屏幕快照 2019-05-20 15.08.06.png

關(guān)于矩陣行列式計(jì)算的更多方法可以參考線性代數(shù)教材。

--
總結(jié):OpenGL中向量與矩陣的簡(jiǎn)要介紹大概就這些了,要想了解全部的內(nèi)容或者更詳細(xì)的內(nèi)容,可以參考一下資料:

  • 《3D數(shù)學(xué)基礎(chǔ):圖形與游戲開(kāi)發(fā)》清華大學(xué)出版社
  • 線性代數(shù)》武漢大學(xué)數(shù)學(xué)與統(tǒng)計(jì)學(xué)院 高等教育出版社 齊民友主編
  • 《交互式計(jì)算機(jī)圖形學(xué)-基于OpenGL著色器的自動(dòng)向下方法》電子工業(yè)出版社 Edward Angle等著

--
系列連載

OpenGL入門(mén)(一)-- 圖形API簡(jiǎn)介與作用
OpenGL入門(mén)(二)-- 快速了解OpenGL下的專(zhuān)業(yè)名詞
OpenGL入門(mén)(三)-- OpenGL坐標(biāo)系解析與坐標(biāo)變換
OpenGL入門(mén)(四)-- OpenGL坐標(biāo)系與坐標(biāo)變換
OpenGL入門(mén)(五)-- OpenGL渲染流程圖解析
OpenGL入門(mén)(六)-- OpenGL 固定存儲(chǔ)著色器的理解使用
OpenGL入門(mén)(七)-- 圖形圖像渲染中的深度緩沖區(qū)
OpenGL入門(mén)(八)-- OpenGL向量和矩陣簡(jiǎn)介
OpenGL入門(mén)(九)-- OpenGL 紋理簡(jiǎn)單介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評(píng)論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評(píng)論 3 421
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,879評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,181評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,935評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,325評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,534評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,892評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,322評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,735評(píng)論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,990評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,800評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,084評(píng)論 2 375

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