OpenGL入門(八)-- 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ò)程稱為標(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大小相同院塞,方向相反的向量遮晚,稱為向量a的負(fù)向量,兩者相加得到零向量拦止,即:
a+(?a)=0

向量夾角

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


image

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

向量點(diǎn)積

向量點(diǎn)積夸政,也稱為向量的數(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

則可以寫為: 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也稱為n階方陣皂吮。例如下圖給出了3x4矩陣A3×4的抽象表示:


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

行向量和列向量

對(duì)于1xn的矩陣戒傻,我們稱之為行向量税手,nx1的矩陣稱為列向量。一般可以用列向量表示空間中的向量(以行向量表示也可以)稠鼻,例如上面的向量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則稱為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的第二列孵睬,其他部分依次類推播歼。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市佛致,隨后出現(xiàn)的幾起案子贮缕,更是在濱河造成了極大的恐慌,老刑警劉巖俺榆,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件感昼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罐脊,警方通過(guò)查閱死者的電腦和手機(jī)定嗓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萍桌,“玉大人宵溅,你說(shuō)我怎么就攤上這事」?洌” “怎么了层玲?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)反症。 經(jīng)常有香客問(wèn)我辛块,道長(zhǎng),這世上最難降的妖魔是什么铅碍? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任润绵,我火速辦了婚禮,結(jié)果婚禮上胞谈,老公的妹妹穿的比我還像新娘尘盼。我一直安慰自己,他們只是感情好烦绳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布卿捎。 她就那樣靜靜地躺著,像睡著了一般径密。 火紅的嫁衣襯著肌膚如雪午阵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音底桂,去河邊找鬼植袍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛籽懦,可吹牛的內(nèi)容都是我干的于个。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼暮顺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厅篓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捶码,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贷笛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宙项,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡株扛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年尤筐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洞就。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盆繁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旬蟋,到底是詐尸還是另有隱情油昂,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布倾贰,位于F島的核電站夕膀,受9級(jí)特大地震影響烛芬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一哈蝇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耙替,春花似錦陆爽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至查排,卻和暖如春凳枝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雹嗦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工范舀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留合是,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓锭环,卻偏偏與公主長(zhǎng)得像聪全,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辅辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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