本篇對OpenGL學習過程中遇到的關鍵的矩陣運算做一個總結,方便以後查閱。
向量
向量高中就接觸了,這個問題應該不大,向量就是一個有方向的量,具有平移不變性,因此我們可以默認所有的向量都是以0點爲起點,這樣就可以只用一個點就表示出一個向量了。
向量計算
向量和標量的運算
向量可以和標量進行加減乘除取反等運算,依次用向量的各個標量去和標量進行運算就可以了,這個不多說,下面給出加法的例子,減乘除取反也是一樣
⎝⎛123⎠⎞+3=⎝⎛1+32+33+3⎠⎞=⎝⎛456⎠⎞
向量加減
和向量與標量的加減法計算差不多,各個分量對應運算即可。
⎝⎛123⎠⎞+⎝⎛456⎠⎞=⎝⎛1+42+53+6⎠⎞=⎝⎛579⎠⎞
向量減法有個特性在OpenGL中會經常用到,我們看下圖:
![向量減法]()
上圖是一個向量減法的計算,w=u−v,我們再將w平移至k,可以看到向量k的方向就是B點指向A點的方向,這個特性在OpenGL控制攝像機的朝向時候會用到。
向量長度
向量長度又叫向量的模,用|v|表示,這個也沒啥難度,用勾股定理就能算,看下下圖就懂了
![勾股定理計算向量的長度]()
向量乘法
向量的普通乘法沒有意義,但是可以有點乘和叉乘:點乘(Dot Product),記作v⋅k;叉乘(Cross Product),記作v×k
點乘
點乘的公式:
v⋅k=∣v∣⋅∣k∣⋅cosθ
如果把這個公式變形可以用來計算向量的夾角
cosθ=∣v∣⋅∣k∣v⋅k
那怎麼計算v⋅k呢?就是各個分量依次相乘,再將結果相加,如下面的向量
⎝⎛123⎠⎞⋅⎝⎛456⎠⎞=(1×4)+(2×5)+(3×6)=32
則這兩個向量的夾角的餘弦值就是
cosθ=∣v∣⋅∣k∣v⋅k=∣v∣⋅∣k∣32
好吧,v和k的模我就不算了,領會精神
公式推導如下圖
![在這裏插入圖片描述]()
![在這裏插入圖片描述]()
叉乘
叉乘只在3D空間中有定義,它需要兩個不平行向量作爲輸入,生成一個正交於兩個輸入向量的第三個向量。
在攝像機章節中,我們用到了一個glm::lookAt函數來設置攝像機,該函數有三個參數,分別是攝像機位置、攝像機觀察的位置和上向量。而攝像機實際上還需要一個指向方向向量和一個右向量,其中,方向向量是用目標的位置向量和攝像機位置向量做差得到的,右向量就是用上向量和方向向量進行叉乘得到的。
下圖是推導過程
![在這裏插入圖片描述]()
整理成矩陣格式就是
⎝⎛AxAyAz⎠⎞×⎝⎛BxByBz⎠⎞=⎝⎛Ay⋅Bz−Az⋅ByAz⋅Bx−Ax⋅BzAx⋅By−Ay⋅Bx⎠⎞
向量標準化
模長爲1的向量通常成爲標準向量,向量標準化就是求與該向量方向相同,模長爲1的向量,即求向量方向上的標準向量,計算方法如下圖,下圖截取自同濟版高數教材第七版下冊
![在這裏插入圖片描述]()
![在這裏插入圖片描述]()
矩陣
矩陣的數學定義我這裏就不說了(其實是不會-_-!),我覺得只要學過的人就算時間再久再怎麼忘了,只要見到應該還認識,矩陣就長這樣
(142536)
這是一個2行3列的矩陣,記作2 × 3
矩陣的加減
矩陣與標量相加減
和向量一樣,所有元素依次相加減即可
(1324)+3=(1+33+32+34+3)=(4657)
矩陣與矩陣相加減
和向量一樣,各個對應元素依次相加減即可
(1324)+(5768)=(1+53+72+64+8)=(610812)
矩陣的數乘
同樣的,所有元素依次相乘,標量就是用它的值縮放(Scale)矩陣的所有元素。
(1324)×3=(1×33×32×34×3)=(39612)
矩陣相乘
關於矩陣相乘,兩個前提條件一定要注意
- 只有當左側矩陣的列數與右側矩陣的行數相等,兩個矩陣才能相乘。即Am×n⋅Bn×l=Cm×l
- 矩陣相乘不遵守交換律(Commutative),也就是說A⋅B̸=B⋅A。
- 設0矩陣爲O,A⋅B=O不能推出A=O或B=O。同樣,若A̸=O,而A⋅(X−Y)=O也不能得出X=Y的結論,例如
(2−34−6)⋅(−214−2)=(0000)
矩陣相乘的公式也好蛋疼,我們用一個例子來說明矩陣相乘是怎麼算的
(142536)⋅⎝⎛791181012⎠⎞=(1×7+2×9+3×114×7+5×9+6×111×8+2×10+3×124×8+5×10+6×12)=(5813964154)
從這個例子可以看出爲什麼矩陣相乘要求左側列數等於右側行數了,如果不相等則沒法計算,也能看出爲什麼結果矩陣的行數等於左側的行數,結果矩陣的列數等於右側的列數了
這個計算方法很是蛋疼,幸運的是我們可以把這個計算過程交給電腦去做,下面是推導過程
設有兩個線性變換
![在這裏插入圖片描述]()
![在這裏插入圖片描述]()
矩陣與向量相乘
向量就是一個具有N行1列的矩陣,矩陣與向量相乘遵守矩陣與矩陣相乘的法則,這裏不再多說,只要注意矩陣的行列數即可
單位矩陣
單位矩陣就是對角線上的元素都是1,其他元素都是0的矩陣,這貨長這樣
⎝⎜⎜⎛1000010000100001⎠⎟⎟⎞
這是一個4×4的矩陣,爲毛這或叫單位矩陣呢?我們來看下下面的矩陣相乘
⎝⎜⎜⎛1000010000100001⎠⎟⎟⎞×⎝⎜⎜⎛1234⎠⎟⎟⎞=⎝⎜⎜⎛1×1+0×2+0×3+0×40×1+1×2+0×3+0×40×1+0×2+1×3+0×40×1+0×2+0×3+1×4⎠⎟⎟⎞=⎝⎜⎜⎛1×11×21×31×4⎠⎟⎟⎞=⎝⎜⎜⎛1234⎠⎟⎟⎞
單位矩陣和任何矩陣相乘結果都等於原矩陣,類似於乘法計算中1和任何數相乘結果都是原數一樣。
矩陣的逆
餘子式和代數餘子式
在n階行列式中,把(i,j)元aij所在的地i行和第j列劃去後,留下來的n−1階行列式叫做(i,j)元aij的餘子式,記作Mij;記
Aij=(−1)i+jMij
Aij叫做(i,j)元aij的代數餘子式,例如四階行列式
D=∣∣∣∣∣∣∣∣a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44∣∣∣∣∣∣∣∣
中(3,2)元a32的餘子式和代數餘子式分別爲
M32=∣∣∣∣∣∣a11a21a41a13a23a43a14a24a44∣∣∣∣∣∣
A32=(−1)3+2M32=−M32
伴隨矩陣
由n階方陣A的元素所構成的行列式(各元素的位置不變),稱爲方陣A的行列式,記作det A 或|A|。
行列式|A|的各個元素的代數餘子式Aij所構成的如下的矩陣
A∗=⎝⎜⎜⎜⎛A11A12⋮A1nA12A22⋮A2n⋯⋯ ⋯An1An2⋮Ann⎠⎟⎟⎟⎞
稱爲矩陣A的伴隨矩陣,簡稱伴隨陣
逆矩陣
![在這裏插入圖片描述]()
![在這裏插入圖片描述]()
求逆矩陣的過程:首先將矩陣寫成行列式,然後求行列式的所有代數餘子式,再將所有的代數餘子式組合成新的矩陣(注意行列變化),即求伴隨矩陣,最後用行列式的倒數乘以伴隨矩陣。
應用
具體應用看下篇OpenGL學習筆記:數學基礎和常用矩陣總結(二)