OpenGL入門(八)-- OpenGL向量和矩陣簡介

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

向量的概念

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


image

注意:

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

零向量與單位向量

向量的長度即模,定義為:


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

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


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

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

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


image

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


image

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

向量夾角

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


image

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

向量點積

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

向量點積的幾何意義

要理解點積的幾何意義,首先了解概念向量在軸上的投影(scalar projection ),這個投影計算得到一個標(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), 則兩個向量的點積可以表示為:


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

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

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


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

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


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

向量的叉積

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


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

叉積如下圖所示:


image

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


image

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

叉積的幾何意義

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


image

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

叉積的應(yīng)用

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

投影向量的計算

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


image

上圖可知與b平行分量a1可計算為:


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

垂直分量a2計算為:


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

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

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

矩陣的概念

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


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

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


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

行向量和列向量

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


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

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

零矩陣和n階單位陣

mxn矩陣,如果所有元素都為0,則成為零矩陣。 對于一個n階方陣,如果主對角線元素全為1,其余元素都為0則稱為n階單位陣。對于一個矩陣Am×n,存在單位陣滿足:ImA=AIn=A。 任意矩陣Am×n與對應(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

矩陣的運算

矩陣加減法

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


image

image

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

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


image

矩陣和矩陣乘法

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

image

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

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

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

矩陣和矩陣相乘舉例

給定兩個矩陣相乘,過程如下圖所示:


image

image

image

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


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

則兩個向量的點積可以表示為:


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

矩陣不滿足交換律舉例

image

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

矩陣和向量相乘

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


屏幕快照 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矩陣的行列式計算如下:
屏幕快照 2019-05-20 15.08.06.png

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

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

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

--
系列連載

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容