在前面绢淀,我們對(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:
注意:
- 向量的大小就是向量的長(zhǎng)度(模),向量的長(zhǎng)度是非負(fù)的账胧;
- 向量的方向描述了向量的指向竞慢;
- 向量是沒(méi)有位置的,與點(diǎn)是不同的治泥;
- 向量與標(biāo)量不同梗顺,變量是只有大小而沒(méi)有方向的量,例如位移是向量车摄,而距離是標(biāo)量;
零向量與單位向量
向量的長(zhǎng)度即模,定義為:
模等于0的向量成為0向量吮播,模等于1的向量叫做單位向量变屁。注意零向量的方向是任意的。
由一個(gè)向量v求與它同方向的單位向量過(guò)程稱為標(biāo)準(zhǔn)化(normalization),這個(gè)單位向量成為標(biāo)準(zhǔn)化向量(normalized vector)意狠。計(jì)算過(guò)程為:
三角形法則和平行四邊形法則
兩個(gè)向量a和b粟关,當(dāng)將b的起點(diǎn)放在a的終點(diǎn),連接a的起點(diǎn)和b的終點(diǎn)的向量成為向量a,b之和环戈,記為:c=a+b,如下圖所示:
物理上力學(xué)求和經(jīng)常使用平行四邊形法則闷板,表達(dá)的是向量加法運(yùn)算的結(jié)合律,即:a+b=b+a,如下圖所示:
與一個(gè)向量a大小相同院塞,方向相反的向量遮晚,稱為向量a的負(fù)向量,兩者相加得到零向量拦止,即:
a+(?a)=0
向量夾角
兩個(gè)非零向量的夾角規(guī)定為不超過(guò)π的角度θ县遣,即:0≤θ≤π,如下圖所示:
注意這個(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θ盐茎。如下圖所示:
則可以寫為: A.B=|A|BA=|B|AB兴垦。
在空間幾何中,例如n空間中字柠,向量的坐標(biāo)表示為: A=(a1,b2,?,cn) 探越,B=(b1,b2,?,bn), 則兩個(gè)向量的點(diǎn)積可以表示為:
向量點(diǎn)積的應(yīng)用
向量點(diǎn)積的一個(gè)重要應(yīng)用在于,可以快速求出兩個(gè)向量的夾角余弦窑业。
兩個(gè)向量的夾角余弦計(jì)算公式為:
當(dāng)a和b都是單位向量時(shí)钦幔,兩單位向量的夾角余弦值為:
cosθ=a.b。
因此常柄,我們能很快的計(jì)算出兩個(gè)單位向量的夾角余弦鲤氢,在計(jì)算光照時(shí)經(jīng)常使用搀擂。
另外當(dāng)一個(gè)向量為單位向量時(shí):
向量的叉積
兩個(gè)向量a和b的叉積,結(jié)果是一個(gè)向量c=a×b卷玉,c的方向垂直于a和b哨颂,它需要根據(jù)右手規(guī)則來(lái)確定,c的大小等于:
叉積如下圖所示:
注意c的方向需要根據(jù)右手規(guī)則來(lái)確定相种。所謂右手規(guī)則是指威恼,將向量a與b放在同一個(gè)起點(diǎn)時(shí),當(dāng)右手的四個(gè)手指從a所指方向轉(zhuǎn)到b所指方向握拳時(shí)寝并,大拇指的指向即為a×b的方向箫措。如下圖所示:
尤其要注意 a×b≠b×a,事實(shí)上衬潦,a×b=?b×a斤蔓。在利用以坐標(biāo)形式表示向量a和b時(shí),在3D空間中别渔,叉積的結(jié)果用矩陣表示為:
叉積的幾何意義
叉積的母矫裕可以視為以a和b為兩邊的平行四邊形的面積,如下圖所示:
其中|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ò)程如下圖所示:
上圖可知與b平行分量a1可計(jì)算為:
垂直分量a2計(jì)算為:
投影向量的應(yīng)用
投影向量的計(jì)算過(guò)程低淡,是一個(gè)向量分解的過(guò)程姓言,這種向量分解的思路在后面推導(dǎo)其他內(nèi)容時(shí)很有幫助,例如求解后面的物體旋轉(zhuǎn)矩陣時(shí)會(huì)派上用場(chǎng)蔗蹋。
矩陣的概念
矩陣從形式上就是一個(gè)數(shù)字表何荚,以行和列的形式呈現(xiàn),簡(jiǎn)單的矩陣如下圖所示:
矩陣的行數(shù)m和列數(shù)n可以不相同猪杭,m行n列矩陣記為矩陣Am×n餐塘。當(dāng)行數(shù)和列數(shù)相等時(shí),m= n ,矩陣A也稱為n階方陣皂吮。例如下圖給出了3x4矩陣A3×4的抽象表示:
行向量和列向量
對(duì)于1xn的矩陣戒傻,我們稱之為行向量税手,nx1的矩陣稱為列向量。一般可以用列向量表示空間中的向量(以行向量表示也可以)稠鼻,例如上面的向量a=(ax,by,cz)可以用列向量表示為:
注意: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的第二列孵睬,其他部分依次類推播歼。
則其轉(zhuǎn)置矩陣為:
矩陣的運(yùn)算
矩陣加減法
兩個(gè)矩陣A和B要能執(zhí)行加減法,必須是行和列數(shù)目相等的掰读,計(jì)算過(guò)程秘狞,即對(duì)應(yīng)的元素相加(Aij+Bij)或者相減(Aij?Bij),如下圖所示:
標(biāo)量和矩陣乘法
用一個(gè)數(shù)k乘以矩陣A蹈集,結(jié)果為矩陣A中每個(gè)元素乘以數(shù)k烁试。例如:
矩陣和矩陣乘法
兩個(gè)矩陣Am×n和Bn×p要執(zhí)行乘法操作,需要滿足: 左邊矩陣的列數(shù)和右邊矩陣的行數(shù)相等拢肆,并且結(jié)果矩陣為Cm×p减响。
計(jì)算過(guò)程如下圖所示:
其中
,即C中第i行第j列的元素,即為矩陣A的第i行和第j的對(duì)應(yīng)元素相乘后的和善榛。例如:
注意矩陣乘法不滿足交換律辩蛋,一般而言矩陣乘積AB≠BA(當(dāng)然存在特殊情況下滿足),因此在OpenGL中應(yīng)用變換矩陣時(shí)注意變換應(yīng)用的順序移盆。變換的例子后面會(huì)介紹悼院。
矩陣和矩陣相乘舉例
給定兩個(gè)矩陣相乘,過(guò)程如下圖所示:
熟悉了矩陣相乘后咒循,則上述向量的點(diǎn)積公式可以重新表示為:
則兩個(gè)向量的點(diǎn)積可以表示為:
矩陣不滿足交換律舉例
這里AB≠BA据途,提醒我們注意矩陣相乘時(shí)的順序绞愚。
矩陣和向量相乘
矩陣和向量相乘是矩陣和矩陣相乘的特例,給定矩陣A和列向量v颖医,相乘過(guò)程如下所示:
行列式
行列式是n階方陣的數(shù)字構(gòu)成的數(shù)的行列集合位衩,例如2階方陣A表示為:
關(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)單介紹