OpenGL學習筆記:數學基礎

本篇對OpenGL學習過程中遇到的關鍵的矩陣運算做一個總結,方便以後查閱。

向量

向量高中就接觸了,這個問題應該不大,向量就是一個有方向的量,具有平移不變性,因此我們可以默認所有的向量都是以0點爲起點,這樣就可以只用一個點就表示出一個向量了。

向量計算

向量和標量的運算

向量可以和標量進行加減乘除取反等運算,依次用向量的各個標量去和標量進行運算就可以了,這個不多說,下面給出加法的例子,減乘除取反也是一樣
(123)+3=(1+32+33+3)=(456) \left( \begin{array}{ccc} 1 \\ 2 \\ 3 \end{array} \right) + 3 = \left( \begin{array}{ccc} 1+3 \\ 2+3 \\ 3+3 \end{array} \right)= \left( \begin{array}{ccc} 4 \\ 5 \\ 6 \end{array} \right)

向量加減

和向量與標量的加減法計算差不多,各個分量對應運算即可。
(123)+(456)=(1+42+53+6)=(579) \left( \begin{array}{ccc} 1 \\ 2 \\ 3 \end{array} \right) + \left( \begin{array}{ccc} 4 \\ 5 \\ 6 \end{array} \right) = \left( \begin{array}{ccc} 1+4 \\ 2+5 \\ 3+6 \end{array} \right)= \left( \begin{array}{ccc} 5 \\ 7 \\ 9 \end{array} \right)
向量減法有個特性在OpenGL中會經常用到,我們看下圖:
向量減法
上圖是一個向量減法的計算,w=uv\vec{w}= \vec{u}-\vec{v},我們再將w\vec{w}平移至k\vec{k},可以看到向量k\vec{k}的方向就是B點指向A點的方向,這個特性在OpenGL控制攝像機的朝向時候會用到。

向量長度

向量長度又叫向量的模,用|v|表示,這個也沒啥難度,用勾股定理就能算,看下下圖就懂了
勾股定理計算向量的長度

向量乘法

向量的普通乘法沒有意義,但是可以有點乘和叉乘:點乘(Dot Product),記作vk\vec{v} \cdot \vec{k};叉乘(Cross Product),記作v×k\vec{v} \times\vec{k}

點乘

點乘的公式:

vk=vkcosθ\vec{v}⋅\vec{k}=|\vec{v}|⋅|\vec{k}|⋅cosθ

如果把這個公式變形可以用來計算向量的夾角
cosθ=vkvk cosθ = \dfrac{\vec{v}⋅\vec{k}}{|\vec{v}|⋅|\vec{k}|}
那怎麼計算v⋅k呢?就是各個分量依次相乘,再將結果相加,如下面的向量
(123)(456)=(1×4)+(2×5)+(3×6)=32 \left( \begin{array}{ccc} 1 \\ 2 \\ 3 \end{array} \right) \cdot \left( \begin{array}{ccc} 4 \\ 5 \\ 6 \end{array} \right) = (1\times4)+(2\times5)+(3\times6)=32
則這兩個向量的夾角的餘弦值就是
cosθ=vkvk=32vk cosθ = \dfrac{\vec{v}⋅\vec{k}}{|\vec{v}|⋅|\vec{k}|} =\dfrac{32}{|\vec{v}|⋅|\vec{k}|}
好吧,v\vec{v}k\vec{k}的模我就不算了,領會精神
公式推導如下圖
在這裏插入圖片描述
在這裏插入圖片描述

叉乘

叉乘只在3D空間中有定義,它需要兩個不平行向量作爲輸入,生成一個正交於兩個輸入向量的第三個向量。
在攝像機章節中,我們用到了一個glm::lookAt函數來設置攝像機,該函數有三個參數,分別是攝像機位置、攝像機觀察的位置和上向量。而攝像機實際上還需要一個指向方向向量和一個右向量,其中,方向向量是用目標的位置向量和攝像機位置向量做差得到的,右向量就是用上向量和方向向量進行叉乘得到的。
下圖是推導過程
在這裏插入圖片描述
整理成矩陣格式就是
(AxAyAz)×(BxByBz)=(AyBzAzByAzBxAxBzAxByAyBx) \left( \begin{array}{ccc} A_x \\ A_y \\ A_z \end{array} \right) \times \left( \begin{array}{ccc} B_x \\ B_y \\ B_z \end{array} \right)= \left( \begin{array}{ccc} A_y \cdot B_z-A_z \cdot B_y\\ A_z \cdot B_x-A_x \cdot B_z\\ A_x \cdot B_y-A_y \cdot B_x\\ \end{array} \right)

向量標準化

模長爲1的向量通常成爲標準向量,向量標準化就是求與該向量方向相同,模長爲1的向量,即求向量方向上的標準向量,計算方法如下圖,下圖截取自同濟版高數教材第七版下冊
在這裏插入圖片描述
在這裏插入圖片描述

矩陣

矩陣的數學定義我這裏就不說了(其實是不會-_-!),我覺得只要學過的人就算時間再久再怎麼忘了,只要見到應該還認識,矩陣就長這樣
(123456) \left( \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 &6\end{array} \right)
這是一個2行3列的矩陣,記作2 ×\times 3

矩陣的加減

矩陣與標量相加減

和向量一樣,所有元素依次相加減即可
(1234)+3=(1+32+33+34+3)=(4567) \left( \begin{array}{ccc} 1 & 2 \\ 3 &4 \end{array} \right) + 3 = \left( \begin{array}{ccc} 1+3 & 2+3 \\ 3+3 & 4 + 3 \end{array} \right)= \left( \begin{array}{ccc} 4 & 5 \\ 6 & 7 \end{array} \right)

矩陣與矩陣相加減

和向量一樣,各個對應元素依次相加減即可
(1234)+(5678)=(1+52+63+74+8)=(681012) \left( \begin{array}{ccc} 1 & 2 \\ 3 &4 \end{array} \right) + \left( \begin{array}{ccc} 5 & 6 \\ 7 &8 \end{array} \right) = \left( \begin{array}{ccc} 1+5 & 2+6 \\ 3+7 & 4 + 8 \end{array} \right)= \left( \begin{array}{ccc} 6 & 8 \\ 10 & 12 \end{array} \right)

矩陣的數乘

同樣的,所有元素依次相乘,標量就是用它的值縮放(Scale)矩陣的所有元素。
(1234)×3=(1×32×33×34×3)=(36912) \left( \begin{array}{ccc} 1 & 2 \\ 3 &4 \end{array} \right) \times 3 = \left( \begin{array}{ccc} 1\times3 & 2\times3 \\ 3\times3 & 4 \times 3 \end{array} \right)= \left( \begin{array}{ccc} 3 & 6 \\ 9 & 12 \end{array} \right)

矩陣相乘

關於矩陣相乘,兩個前提條件一定要注意

  1. 只有當左側矩陣的列數與右側矩陣的行數相等,兩個矩陣才能相乘。即Am×nBn×l=Cm×lA_{m\times n} \cdot B_{n\times l}=C_{m\times l}
  2. 矩陣相乘不遵守交換律(Commutative),也就是說ABBAA \cdot B \neq B \cdot A
  3. 設0矩陣爲OOAB=OA \cdot B=O不能推出A=OA=OB=OB=O。同樣,若AOA \neq O,而A(XY)=OA\cdot(X-Y)=O也不能得出X=YX=Y的結論,例如
    (2436)(2412)=(0000) \left( \begin{array}{ccc} 2 & 4 \\ -3 &-6 \end{array} \right) \cdot \left( \begin{array}{ccc} -2 & 4 \\ 1 &-2 \end{array} \right) = \left( \begin{array}{ccc} 0 & 0 \\ 0 &0 \end{array} \right)

矩陣相乘的公式也好蛋疼,我們用一個例子來說明矩陣相乘是怎麼算的
(123456)(789101112)=(1×7+2×9+3×111×8+2×10+3×124×7+5×9+6×114×8+5×10+6×12)=(5864139154) \left( \begin{array}{ccc} 1 & 2 & 3 \\ 4 &5 &6 \end{array} \right) \cdot \left( \begin{array}{ccc} 7 & 8 \\ 9 &10 \\ 11 &12 \end{array} \right) = \left( \begin{array}{ccc} 1\times7+2\times9+3\times11&1\times8+2\times10+3\times12 \\ 4\times7+5\times9+6\times11&4\times8+5\times10+6\times12 \end{array} \right)= \left( \begin{array}{ccc} 58 & 64 \\ 139 & 154 \end{array} \right)
從這個例子可以看出爲什麼矩陣相乘要求左側列數等於右側行數了,如果不相等則沒法計算,也能看出爲什麼結果矩陣的行數等於左側的行數,結果矩陣的列數等於右側的列數了
這個計算方法很是蛋疼,幸運的是我們可以把這個計算過程交給電腦去做,下面是推導過程
設有兩個線性變換
在這裏插入圖片描述
在這裏插入圖片描述

矩陣與向量相乘

向量就是一個具有N行1列的矩陣,矩陣與向量相乘遵守矩陣與矩陣相乘的法則,這裏不再多說,只要注意矩陣的行列數即可

單位矩陣

單位矩陣就是對角線上的元素都是1,其他元素都是0的矩陣,這貨長這樣
(1000010000100001) \left( \begin{array}{ccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array} \right)
這是一個4×44\times4的矩陣,爲毛這或叫單位矩陣呢?我們來看下下面的矩陣相乘
(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) \left( \begin{array}{ccc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array} \right) \times \left( \begin{array}{ccc} 1 \\ 2 \\ 3 \\ 4 \end{array} \right) = \left( \begin{array}{ccc} 1\times1+0\times2+0\times3+0\times4 \\ 0\times1+1\times2+0\times3+0\times4 \\ 0\times1+0\times2+1\times3+0\times4 \\ 0\times1+0\times2+0\times3+1\times4 \end{array} \right)= \left( \begin{array}{ccc} 1\times1 \\ 1\times2 \\ 1\times3 \\ 1\times4 \end{array} \right) = \left( \begin{array}{ccc} 1 \\ 2 \\ 3 \\ 4 \end{array} \right)
單位矩陣和任何矩陣相乘結果都等於原矩陣,類似於乘法計算中1和任何數相乘結果都是原數一樣。

矩陣的逆

餘子式和代數餘子式

在n階行列式中,把(i,j)(i,j)aija_{ij}所在的地ii行和第jj列劃去後,留下來的n1n-1階行列式叫做(i,j)(i,j)aija_{ij}餘子式,記作MijM_{ij};記
Aij=(1)i+jMijA_{ij}=(-1)^{i+j}M_{ij}
AijA_{ij}叫做(i,j)(i,j)aija_{ij}代數餘子式,例如四階行列式
D=a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44 D=\left| \begin{array}{ccc} a_{11} &a_{12} & a_{13} &a_{14} \\ a_{21} &a_{22} & a_{23} &a_{24} \\ a_{31} &a_{32} & a_{33} &a_{34} \\ a_{41} &a_{42} & a_{43} &a_{44} \\\end{array} \right|
(3,2)(3,2)a32a_{32}的餘子式和代數餘子式分別爲
M32=a11a13a14a21a23a24a41a43a44 M_{32}=\left| \begin{array}{ccc} a_{11} & a_{13} &a_{14} \\ a_{21} & a_{23} &a_{24} \\ a_{41} & a_{43} &a_{44} \end{array} \right|
A32=(1)3+2M32=M32 A_{32}=(-1)^{3+2}M_{32}=-M_{32}

伴隨矩陣

由n階方陣A的元素所構成的行列式(各元素的位置不變),稱爲方陣A的行列式,記作det A 或|A|。
行列式|A|的各個元素的代數餘子式AijA_{ij}所構成的如下的矩陣
A=(A11A12An1A12A22An2 A1nA2nAnn) A^*=\left( \begin{array}{ccc} A_{11} & A_{12} & \cdots & A_{n1} \\ A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots & \ & \vdots \\ A_{1n} & A_{2n} & \cdots & A_{nn} \\ \end{array} \right)
稱爲矩陣A的伴隨矩陣,簡稱伴隨陣

逆矩陣

在這裏插入圖片描述
在這裏插入圖片描述
求逆矩陣的過程:首先將矩陣寫成行列式,然後求行列式的所有代數餘子式,再將所有的代數餘子式組合成新的矩陣(注意行列變化),即求伴隨矩陣,最後用行列式的倒數乘以伴隨矩陣。

應用

具體應用看下篇OpenGL學習筆記:數學基礎和常用矩陣總結(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章