3D數學基礎:圖形和遊戲開發(第2版) 第二章 筆記

3D數學基礎:圖形和遊戲開發(第2版) 第二章 筆記

供參考和備忘用html

向量(Vector)

對數學家來講向量就是一個數字列表,對程序員來講向量能夠數組(Array)表示,但在計算機的圖形開發中咱們側重於向量的幾何表示。程序員

從幾何學上講,向量是具備大小和方向的有向線段。在圖形上經常使用箭頭(起點指向終點)表示,由於它捕獲了向量的兩個定義特徵:大小和方向。數組

  • 向量的大小(Magnitude):是指向量的長度。向量的長度是非負的。
  • 向量的方向(Direction):是指向量在空間中指向的方向。

向量是沒有位置的,只有大小和方向。它描述了從一個位置到另外一個位置的位移,是一種相對位置關係而不是絕對位置。ide

向量a可書寫爲:\(\vec a\)函數

在紙面上描述向量

在書寫向量時,有兩種表達方式:水平寫入和垂直寫入,水平寫入的向量稱爲行向量(Row Vector),垂直寫入的稱爲列向量(Column Vector)。spa

行向量

以下所示的一個三維行向量,各個數字間可用逗號或空格隔開:scala

\[\begin{bmatrix} x,y,z \end{bmatrix} \]

列向量

以下所示的一個三維列向量:3d

\[\begin{bmatrix} x\\ y \\ z \\ \end{bmatrix} \]

向量的維度

向量的維度表示向量中元素的個數。一個元素就是一維向量,兩個數元素就是二維向量,三個元素就是三維向量......orm

份量

份量用來表示向量中具體的某一個元素,好比向量中的第一個份量表示向量中的第一個元素。
表示方式:htm

  1. 使用下標,如:\(v_1\) 指的是向量 \(v\) 中的第一個元素。
  2. 使用字母,使用x、y來指代二維向量中的元素;使用x、y、z表示三維向量中的元素;使用x、y、z、w表示四維向量中的元素。

例如,以下向量中,\(a_1 = a_x = 1\)表示的都是向量 \(a\) 的第一個份量。

\[a = \begin{bmatrix} 1 \\ 2 \\ \end{bmatrix} \]

標量(Scalar)

標量其實就是普通數字的技術術語,與咱們平常中使用的數字無異。

使用笛卡爾座標指定向量

在二維笛卡爾座標中,X向右爲正,Y向上爲正。對於二維向量\([1.5,2]\),在二維笛卡爾座標系中可描述爲:向右移動1.5個單位而後向上移動兩個單位,或者向上移動兩個單位而後向右移動1.5個單位。

零向量(Zero Vector)

零向量表示沒有方向且長度爲0的向量。能夠將零向量看做是表達「無位移」概念的一種方式。

向量與點

點用於指定位置,向量用於描述位移。

點的位置是相對的——相對於指定其座標的座標系的原點。

向量描述了一個位置到另外一個位置的位移,是一種相對位置關係。

因此,若是從原點(參考點)開始並按向量\([x,y]\)指定的量移動,那麼將最終到達點\((x,y)\)所描述的位置。也就是說向量\([x,y]\)給出了從原點(參考點)到點(x,y)的位移。好比,在二維笛卡爾座標系中,點:\((1,2)\),能夠表示爲向量:\([1,2]\),原點(0,0)開始,向右移動了1個單位,而後向上移動了2個單位,而後到達點\((1,2)\)

一切都是相對的

世界上有不少東西都是很難創建「絕對」參考的東西。好比上面提到的點和向量。另外還有溫度、速度、音量等等。
好比咱們說體溫是:37.3℃,是相對於0℃(水的冰點)來講的。

向量的運算

負向量

負向量就是將向量的每個份量變爲其相反數。\(\vec a\)的負向量爲\(-\vec a\)

好比,向量:\([-3,2]\)的負向量爲:\(-[-3,2] = [3,-2]\)

使向量變負會產生大小相同但方向相反的向量。

向量與標量的乘法

被乘數與乘數

被乘數通常放在算式的前面,乘數通常放在算式的後面。被乘數表示需重複相加的數,乘數表示需重複相加的次數。

如:\(4 \times 2 = 8\),4是被乘數,2是乘數。讀做:4 乘以 2 等於8,或者讀做:2 4 等於8。表示2個4相加。

向量乘以標量

向量不能與標量相加,可是能夠將向量乘以標量。其實,向量乘以標量也能夠當作標量個向量相加的和。

其結果是一個與原始向量平行的向量,但具備不一樣的長度和可能相反的方向。也可理解爲:對原始向量進行長度爲標量的絕對值的縮放,若是標量小於0,則翻轉向量的方向。

計算方式:將標量與每個向量的份量相乘。如:

\[\begin{bmatrix} x \\ y \\ z\\ \end{bmatrix}k = k \begin{bmatrix} x \\ y \\ z\\ \end{bmatrix} = \begin{bmatrix} kx \\ ky \\ kz\\ \end{bmatrix} \]

向量除以非零標量

等價於向量乘以此標量的倒數。反過來,標量是不能夠除以向量的。向量也不能夠除以另外一個向量。

\[\frac{\vec v}{k} = \vec {v}{\frac{1}{k}} \]

一些注意事項:

  • 當將向量乘以標量時,沒必要使用任何乘法符號。乘法是經過將兩個量並排放置(一般右邊是向量)來表示的。
  • 標量和向量的乘法和除法都在任何加法和減法以前發生。
  • 負向量能夠被視爲將向量乘以標量-1的特殊狀況。

向量的加法和減法

兩個向量相加或相減,它們必須具備相同的維度,不一樣維度不能相加減。

向量的加法

計算方式:將向量對應的份量相加便可。如:

\[\begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} + \begin{bmatrix} a \\ b \\ c \\ \end{bmatrix} = \begin{bmatrix} a \\ b \\ c \\ \end{bmatrix} + \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} = \begin{bmatrix} x+a \\ y+b \\ z+c \\ \end{bmatrix} \]

向量的加法知足交換律,即:\(\vec a + \vec b = \vec b + \vec a\)

向量的減法

相應的份量相減便可。向量的減法能夠理解爲加上一個向量的負向量。即:\(\vec a - \vec b = \vec a + (- \vec b)\)。如:

\[\begin{bmatrix} x \\ y \\ z \end{bmatrix} - \begin{bmatrix} a \\ b \\ c \end{bmatrix} = \begin{bmatrix} x \\ y \\ z \end{bmatrix} + (- \begin{bmatrix} a \\ b \\ c \end{bmatrix}) = \begin{bmatrix} x-a \\ y-b \\ z-c \\ \end{bmatrix} \]

向量的減法不知足交換律,即:\(\vec a - \vec b \neq \vec b - \vec a\),它們的結果長度相同但方向相反,因此,\(\vec a - \vec b = -(\vec b - \vec a)\)

幾何解釋

\[\begin{bmatrix} 1 \\ 2 \end{bmatrix} + \begin{bmatrix} 3 \\ 4 \end{bmatrix} = \begin{bmatrix} 4 \\ 6 \end{bmatrix} \]

如上所示的向量加法,可描述爲:向右移動1個單位 -> 向上移動2個單位 -> 再向右移動3個單位 -> 在向上移動4個單位。

向量的大小

向量的大小也稱爲向量的長度(Length)。它的值是非負的。

表示方式:\(||向量||\)。如,\(\vec a\)的長度表示爲:\(||\vec a||\)

計算方式:向量各個份量的平方和的平方根。如,\(\vec v = [3,4]\)的長度計算方式爲:

\[||\vec v|| = \sqrt{3^2+4^2} = 5 \]

單位向量(Unit Vector)

對於許多向量,咱們只關注其方向而不是大小(如:法線(Normal)),在這些狀況下,使用單位向量一般會很方便。

單位向量是大小爲1的向量。單位向量也被稱爲歸一化向量(Normalized Vector)。

任何非零向量的單位向量的計算方式:向量除以向量的長度,以下所示:

\[\hat v = \frac{\vec v}{||\vec v||} \]

例如,向量\([3,4]\)的單位向量爲:

\[\frac{[3,4]}{||[3,4]||} = \frac{[3,4]}{\sqrt{3^2+4^2}} = \frac{[3,4]}{5} = [\frac{3}{5},\frac{4}{5}] = [0.6,0.8] \]

距離公式

距離爲兩點之間的線段長度。因爲向量是有向線段,所以幾何上有意義的是,兩點之間的距離將等於從一點到另外一點的向量的長度。

\(\vec a\)\(\vec b\)間距離的計算方式:

  1. 第一步:求出\(\vec a\)\(\vec b\)的向量
  2. 第二步:求出該向量的長度

例如,\(\vec a = [x,y]\)\(\vec b = [m,n]\)。求\(\vec a\)\(\vec b\)的距離:

設,\(\vec d\)\(\vec a\)\(\vec b\)的向量;則,\(\vec d = \vec b - \vec a\)
計算出:\(\vec d = [m-x,n-y]\)
因此距離爲:\(||\vec d|| = \sqrt{(m-x)^2 + (n-y)^2}\)

其實,計算兩個向量的距離就是計算兩個向量的差所得向量的長度。

向量點積(Dot Product)

點積也稱爲內積(Inner Product),點積的名稱來自向量乘積表示法中使用的點符號,且不能省略點符號。

向量\(\vec a\)與向量\(\vec b\)的點積表示爲:\(\vec a \cdot \vec b\)

計算方式:相應份量的乘積之和,獲得的是一個標量。以下所示:

\[\begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_{n-1} \\ a_n \end{bmatrix} \cdot \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_{n-1} \\ b_n \end{bmatrix} = a_1b_1 + a_2b_2 + \cdots + a_{n-1}b_{b-1} + a_nb_n \]

點積知足交換律,也就是說:\(\vec a \cdot \vec b = \vec b \cdot \vec a\)

這裏有一個與之比較貼近現實的例子:
假設你有3噸小麥、4噸糖、2噸大米,則能夠表示爲:\([3,4,2]\)
其中,1噸小麥162元,1噸糖558元,1噸大米495元,則能夠表示爲:\([162,558,495]\)
那麼,你的總收入爲:\(3 \times 162 + 4 \times 558 + 2 \times 495 = 3798\)元。
來源:https://www.quora.com/Why-is-the-definition-of-the-dot-product-the-way-it-is

幾何意義

點積1

如何上圖所示,\(\vec a\)\(\vec b\)的夾角爲\(\theta\)\(\vec c = \vec a - \vec b\)\(\vec a\)\(\vec b\)\(\vec c\)構成一個三角形。

由三角形餘弦定理可知:

\[||\vec c||^2 = ||\vec a||^2 + ||\vec b||^2 -2||\vec a||||\vec b||cos\theta \]

假設:

\[\vec a = \begin{bmatrix} a_1 \\ a_2 \\ \end{bmatrix} \]

\[\vec b = \begin{bmatrix} b_1 \\ b_2 \\ \end{bmatrix} \]

由上方的 向量的大小 描述可知:

\[||\vec a||^2 = {a_1}^2 + {a_2}^2 \]

\[||\vec b||^2 = {b_1}^2 + {b_2}^2 \]

又:

\[||\vec c||^2 = ||(\vec a - \vec b)||^2 = ||\begin{bmatrix} a_1-b_1 \\ a_2-b_2 \\ \end{bmatrix}||^2 = (a_1-b_1)^2 + (a_2-b_2)^2 = {a_1}^2 +{b_1}^2 -2a_1b_1 + {a_2}^2 +{b_2}^2 -2a_2b_2 \]

因此:

\[{a_1}^2 +{b_1}^2 -2a_1b_1 + {a_2}^2 +{b_2}^2 -2a_2b_2 = {a_1}^2 + {a_2}^2 + {b_1}^2 + {b_2}^2 -2||\vec a||||\vec b||cos\theta \]

化簡得:

\[a_1b_1 + a_2b_2 = ||\vec a||||\vec b||cos\theta \]

因此咱們能夠推導出向量點積的另外一種計算方式:\(||\vec a||||\vec b||cos\theta\),也就是說:

\[\vec a \cdot \vec b = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_{n-1} \\ a_n \end{bmatrix} \cdot \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_{n-1} \\ b_n \end{bmatrix} = a_1b_1 + a_2b_2 + \cdots + a_{n-1}b_{b-1} + a_nb_n = ||\vec a||||\vec b||cos\theta \]

\(||\vec b||cos\theta\)的另外一層含義是什麼?
點積2

由上圖和三角函數可知:\(m = ||\vec b||cos\theta\),因此:\(\vec a \cdot \vec b = ||\vec a||m\)

那麼,\(m\)是什麼?\(m\)\(\vec b\)\(\vec a\)上投影的長度。以下圖所示:
點積投影

圖源:https://www.shuxuele.com/algebra/vectors-dot-product.html

因此兩個向量點積的幾何意義爲:一個向量在另外一個向量上投影的長度與另外一個向量長度的乘積

兩個向量夾角的啓示
\(\vec a \cdot \vec b\) \(\theta\) 角度爲 \(\vec a\)\(\vec b\)
>0 \(0^\circ \leq \theta < 90^\circ\) 銳角 主要指向同一方向
0 \(\theta = 90^\circ\) 直角 垂直
<0 \(90^\circ < \theta \leq 180^\circ\) 鈍角 主要指向反方向
向量點積的分配律

\[\vec a \cdot (\vec b + \vec c) = \vec a \cdot \vec b + \vec a \cdot \vec c \]

幾何上證實:
點積3

由上圖所示:\(\vec d = \vec b + \vec c\)\(\vec b\)\(\vec a\)向量上的投影長度爲\(x\)\(\vec c\)\(\vec a\)向量上的投影長度爲\(y\)\(\vec d\)\(\vec a\)向量上的投影長度爲\(z\)\(z = x+y\)
可知:

\[\vec a \cdot (\vec b + \vec c) = \vec a \cdot \vec d = ||\vec a||z \]

\[\vec a \cdot \vec b + \vec a \cdot \vec c = \vec a \cdot \vec d = ||\vec a||x + ||\vec a||y = ||\vec a||(x+y) \]

又,\(z = x+y\),因此:

\[\vec a \cdot (\vec b + \vec c) = \vec a \cdot \vec b + \vec a \cdot \vec c \]

點積與任意矢量和標量的乘法的結合律

\[(k\vec a) \cdot \vec b = k(\vec a \cdot \vec b) = \vec a \cdot (k\vec b) \]

證實:

\[(k\vec a) \cdot \vec b = \begin{bmatrix} ka_1 \\ ka_2 \end{bmatrix} \cdot \begin{bmatrix} b_1 \\ b_2 \end{bmatrix} = ka_1b_1 + ka_2b_2 = k(a_1b_1 + a_2b_2) \]

\[k(\vec a \cdot \vec b) = k(\begin{bmatrix} a_1 \\ a_2 \end{bmatrix} \cdot \begin{bmatrix} b_1 \\ b_2 \end{bmatrix}) = k(a_1b_1 + a_2b_2) \]

\[\vec a \cdot k(\vec b) = \begin{bmatrix} a_1 \\ a_2 \end{bmatrix} \cdot \begin{bmatrix} kb_1 \\ kb_2 \end{bmatrix} = a_1kb_1 + a_2kb_2 = k(a_1b_1 + a_2b_2) \]

關於向量點積的一些參考連接:
https://www.shuxuele.com/algebra/vectors-dot-product.html
https://www.quora.com/Why-is-the-definition-of-the-dot-product-the-way-it-is

另,3Blue1Brown關於點積的筆記
3Blue1Brown點積筆記

向量叉積(Cross Product)

叉積又叫外積或向量積(Vector Product),只能在三維中應用。結果是一個向量

向量\(\vec a\)與向量\(\vec b\)的叉積表示爲:\(\vec a \times \vec b\)

計算方式:

\[\begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ \end{bmatrix} \times\ \begin{bmatrix} x_2 \\ y_2 \\ z_2 \\ \end{bmatrix} = \begin{bmatrix} y_1z_2 - z_1y_2 \\ z_1x_2 - x_1z_2 \\ x_1y_2 - y_1x_2 \\ \end{bmatrix} \]

向量的叉積不知足交換律:\(\vec a \times \vec b \neq \vec b \times \vec a = -(\vec b \times \vec a)\)

向量的叉積不知足結合律:\((\vec a \times \vec b) \times \vec c \neq \vec a \times (\vec b \times \vec c)\)

幾何意義

假設\(\vec a\)\(\vec b\)的叉積爲:\(\vec m\),也就是說:

\[\vec a = \begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ \end{bmatrix} \]

\[\vec a = \begin{bmatrix} x_2 \\ y_3 \\ z_2 \\ \end{bmatrix} \]

\[\vec m = \begin{bmatrix} y_1z_2 - z_1y_2 \\ z_1x_2 - x_1z_2 \\ x_1y_2 - y_1x_2 \\ \end{bmatrix} \]

那麼計算向量\(\vec m\)的長度的平方,\(||\vec m||^2\)爲:

\[(y_1z_2 - z_1y_2)^2+(z_1x_2 - x_1z_2)^2+(x_1y_2 - y_1x_2)^2 \]

展開後,可得:

\[({y_1z_2})^2+({z_1y_2})^2+({z_1x_2})^2+({x_1z_2})^2+({x_1y_2})^2+({y_1x_2})^2 - 2y_1y_2z_1z_2 -2x_1x_2z_1z_2 - 2x_1x_2y_1y_2 \]

等價於:

\[({x_1}^2 + {y_1}^2 + {z_1}^2) \times\ ({x_2}^2 + {y_2}^2 + {z_2}^2) - (x_1x_2 + y_1y_2 + z_1z_2)^2 \]

等價於:

\[||\vec a||^2||\vec b||^2 - (\vec a \cdot \vec b)^2 \]

等價於:

\[||\vec a||^2||\vec b||^2 - (||\vec a||||\vec b||cos\theta)^2 \]

等價於:

\[||\vec m||^2 = ||\vec a||^2||\vec b||^2(1- cos\theta^2) = ||\vec a||^2||\vec b||^2sin\theta^2 \]

因此:

\[||\vec m|| = ||\vec a||||\vec b||sin\theta \]

那麼,\(||\vec b||sin\theta\)的另外一層含義是什麼?
叉積

由上圖可知,\(||\vec b||sin\theta = h\),而\(h\)垂直於\(\vec a\),那麼:

\[||\vec m|| = ||\vec a||||\vec b||sin\theta = ||\vec a||h \]

這能夠看做是:\(\vec a\)\(\vec b\)構成的平行四邊形的面積(底乘以高)

也就是說,\(\vec a \times \vec b\)的長度爲\(\vec a\)\(\vec b\)構成的平行四邊形的面積。

向量叉積的方向

叉積是個向量呀,如今知道了大小,那方向了?

首先,咱們知道:\(\vec m = \vec a \times\ \vec b\)

那麼咱們先來計算:\(\vec m \cdot \vec a\)

\[\vec m \cdot \vec a = \begin{bmatrix} y_1z_2 - z_1y_2 \\ z_1x_2 - x_1z_2 \\ x_1y_2 - y_1x_2 \\ \end{bmatrix} \cdot \begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ \end{bmatrix} \]

展開:

\[\vec m \cdot \vec a = x_1y_1z_2 - x_1y_2z_1 + x_2y_1z_1 - x_1y_1z_2 + x_1y_2z_1 - x_2y_1z_1 = 0 \]

獲得:\(\vec m \cdot \vec a = 0\),這意味着:\(\vec m\)垂直於\(\vec a\) !!!

以一樣的方式計算\(\vec m \cdot \vec b\),依然會獲得相同的結果,也就是說:\(\vec m\)垂直於\(\vec b\) !!!

更進一步說:\(\vec m\)垂直於\(\vec a\)\(\vec b\)構成的平面。

但是,垂直於平面的向量可能有兩個方向啊,如何肯定是哪一個方向了?

例如:\(\vec a \times\ \vec b\)

一、對於右手座標系

右手握拳,豎起大拇指。若是從你的視點\(\vec a\)\(\vec b\)是逆時針旋轉,那麼大拇指的指向也就是叉積的方向指向你;順時針,則指向遠離你的方向。

二、對於坐手座標系

左手握拳,豎起大拇指。若是從你的視點\(\vec a\)\(\vec b\)是順時針旋轉,那麼大拇指的指向也就是叉積的方向指向你;逆時針,則指向遠離你的方向。

關於向量叉積的一些參考連接:
https://www.shuxuele.com/algebra/vectors-cross-product.html

另,3Blue1Brown關於叉積的筆記
3Blue1Brown叉積筆記

相關文章
相關標籤/搜索