【几何系列】向量:向量乘法(标量积、向量积)和向量插值
在本系列上一篇《【幾何系列】復數基礎與二維空間旋轉》講述了復數和二維旋轉之間的聯系。
在本文,向量是線性代數中的基本知識,本文只會側重它們在計算機圖形學和旋轉幾何學中的要點。
向量的記號
向量(vector)常用粗體來表示,與標量相區分(不過我為了方便,僅在此處加粗體)。例如:
$$mathbf{u}=egin{bmatrix}
2\
3
end{bmatrix}$$
其中 2 和 3 都稱為向量 $mathbf{u}$ 的分量(component)。向量還可以分為列向量和行向量,列向量常常是推薦的表示方法。
向量的圖示
向量作為一種代數元素,在計算機圖形學中常用于表示空間中的有向線段和點。
如下圖所示:
利用向量的表示,有向線段 $u$ 可以通過 $A$ 和 $B$ 兩點相減計算得到:
$$mathbf{u}=egin{bmatrix}
3\
4
end{bmatrix}-egin{bmatrix}
1\
1
end{bmatrix}=egin{bmatrix}
2\
3
end{bmatrix}$$
可以看到,對于有向線段 $u$ 來說,它的向量表示保存了兩條信息:方向和長度。而對于坐標點 $A$ 和 $B$ 來說,實際上也隱含了兩條類似的信息:原點到坐標點的方向和原點到坐標點的距離長度。方向通過向量各分量的比例而確定,而長度則是通過向量大小(magnitude)確定。
向量大小
向量大小寫作 $left | u ight |$,對分量應用畢達哥拉斯定理(國內稱勾股定理)計算得到:
$$left | u ight |=sqrt{x^2+y^2}$$
其中 $x$ 和 $y$ 表示 $u$ 的兩個分量。
推廣到三維
前面考慮的是二維平面,如果推廣到三維,則可以用向量表示出三維空間的點或有向線段:
$$u=egin{bmatrix}
x\
y\
z
end{bmatrix}$$
其大小為:
$$left | u ight |=sqrt{x^2+y^2+z^2}$$
單位向量
前面說到,向量包含方向和大小的信息。那如果我們只關注方向信息呢?自然會想到把大小固定下來,進而引入了單位向量。
單位向量就是大小為 1 的向量,把普通向量轉換為單位向量的過程稱為規范化或標準化(normalization)。
向量的規范化很容易,將向量除以它的大小即可。
$$hat{u}=frac{u}{left | u ight |}$$
其中 $hat{u}$ 是 $u$ 所對應的單位向量。
笛卡爾向量
笛卡爾向量是特殊的單位向量,對應于笛卡爾坐標系中的 x/y/z 軸。即:
$$i=[1,0,0]^T,j=[0,1,0]^T,k=[0,0,1]^T$$
向量乘法
有兩種向量乘法的定義,一種是兩個向量相乘得到一個標量,稱為標量積,又稱點乘、點積、數量積;另一種是兩個向量相乘得到一個向量,稱為向量積,又稱叉乘、叉積、矢量積。
標量積
標量積通過兩個向量相乘得到一個標量。標量積的幾何定義為:
$$rcdot s=left | r ight |left | s ight |coseta$$
簡單來說,就是向量 $r$ 對 $s$ 作投影,得到 $rcoseta$,再將投影的大小 $left | r ight |coseta$ 和 $s$ 向量的大小 $left | s ight |$ 相乘(可以交換,不管哪個向量對另一個向量作投影結果都是相同的)。
標量積的設計是有道理的。
一方面,標量積在一定程度衡量了兩個向量方向的“相似性”。固定大小的兩個向量,夾角越小,方向越接近,相似度越高。
另一方面,標量積既然得到的是一個標量,向量又是標量的一種推廣,我們自然希望它和普通標量的乘法統一起來。
與標量不同的是,向量具有方向性。那么在設計標量積的時候,一些顯然需要考慮的場景是:
當兩個向量方向一致時,我們希望這個標量積就等于兩個向量大小的乘積。
當兩個向量方向相反時,我們希望這個標量積等于向量方向一致情況的相反數。
當兩個向量相互垂直(正交)時,這兩個向量其實是線性無關的,我們認為它們倆其實沒啥交流語言(或者說相似性為 0),乘積為 0 最好。
利用以上特殊場景,當面對更普遍的情況時,對向量進行正交分解,不難得到$rcdot s=left | r ight |left | s ight |coseta$ 的定義。
當然,這只是定義而已,前面這些考慮都只是為了幫助理解這個定義的幾何含義。
標量積還有它的代數定義:
$$rcdot s=r_xs_x+r_ys_y+r_zs_z$$
即兩個向量的各個分量分別相乘,再相加。
標量積的幾何定義和代數定義在笛卡爾坐標系上是等價的。即:從幾何定義出發可以推導出代數定義,而從代數定義也可以推導出幾何定義。
這兩種定義給了我們兩條解決問題的路徑,顯然,利用數量積作為橋梁,求兩個向量的夾角也變得容易起來:
$$eta =arccos(frac{r_xs_x+r_ys_y+r_zs_z}{left | r ight |left | s ight |})$$
馬里奧賽車里面的標量積應用:
要獲得最大程度的加速效果,開車的方向要與加速板的方向盡可能一致,對加速板方向的投影大小要盡可能大。
向量積
向量積通過兩個向量相乘得到另一個向量。
向量積定義為:
$$left |a ight | imes left | b ight |=left | t ight |$$
其中 $t$ 的向量大小為:
$$left | t ight |=left |a ight | left | b ight |sin heta$$
由于向量積得到的一個向量,那么向量就會有方向和大小兩條信息。
對于向量 $t$ 的大小,如上圖所示,向量積大小等于兩個向量張成的平行四邊形的面積。該面積衡量了兩個向量的差異性(difference)。如果 $a$ 和 $b$ 是垂直(正交)的,兩者的差異性最大,在兩個向量大小不變的情況此時面積最大($sin heta=1$);如果$a$ 和 $b$ 是共線的,兩者的差異性最小,此時面積等于 0。
對于向量 $t$ 的方向,考慮的是這樣的問題:兩個向量雖然張成的面積一樣,但是方向卻可能不同,只考慮張成的平行四邊形面積大小會丟失掉這樣的差異。例如笛卡爾向量,如果只考慮面積大小,$i imes j$ 和 $i imes k$ 得到的結果是完全一樣的,但是 $j$ 和 $k$ 卻是不同的方向。因此為了添加這個方向信息,如下圖所示,通常采用右手法則(一種約定,區別于左手法則),規定了向量積 $t$ 的方向,即垂直于 $a$ 和 $b$ 張成的平面。于是$i imes j$ 和 $i imes k$ 雖然向量大小相同,向量方向卻不同。
向量積不滿足交換律,但滿足反對稱關系:
根據這種關系,可以很容易知道笛卡爾向量的計算規律:
$$i imes j=k$$
$$j imes i=-k$$
$$j imes k=i$$
$$k imes j=-i$$
$$k imes i=j$$
$$i imes k=-j$$
我們還知道同一向量的向量積為 0(因為夾角 $ heta$ 為 0):
$$i imes i=0$$
$$j imes j=0$$
$$k imes k=0$$
基于以上關系,我們可以推導出向量積的代數計算公式。
已知兩個向量 $a=a_xi+a_yj+a_zk$ 和 $b=b_xi+b_yj+b_zk$,計算:
egin{align*}
a imes b &= (a_xi+a_yj+a_zk) imes(b_xi+b_yj+b_zk)\
&=a_xb_xi imes i + a_yb_yj imes j+a_zb_zk imes k+a_xb_yi imes j+a_xb_zi imes k+a_yb_xj imes i+a_yb_zj imes k+a_zb_xk imes i+a_zb_yk imes j\
&=0+0+0+a_xb_yk-a_xb_zj-a_yb_xk+a_yb_zi+a_zb_xj-a_zb_yi\
&=(a_yb_z-a_zb_y)i+(a_zb_x-a_xb_z)j+(a_xb_y-a_yb_x)k\
&=egin{vmatrix}
a_y & a_z\
b_y & b_z
end{vmatrix}i-egin{vmatrix}
a_x & a_z\
b_x & b_z
end{vmatrix}j+egin{vmatrix}
a_x & a_y\
b_x & b_y
end{vmatrix}k \
&=egin{vmatrix}
i & j & k\
a_x & a_y & a_z\
b_x & b_y & b_z
end{vmatrix}
end{align*}
最后兩步使用了行列式進行整理。最后,我們把向量積的定義和代數計算公式結合起來就是:
egin{align*}
mathbf{a} imes mathbf{b} &= left | mathbf{a} ight |left | mathbf{b} ight |sin heta hat{mathbf{t}} \
&=egin{vmatrix}
i & j & k\
a_x & a_y & a_z\
b_x & b_y & b_z
end{vmatrix}\
&=egin{vmatrix}
a_y & a_z\
b_y & b_z
end{vmatrix}i-egin{vmatrix}
a_x & a_z\
b_x & b_z
end{vmatrix}j+egin{vmatrix}
a_x & a_y\
b_x & b_y
end{vmatrix}k
end{align*}
$hat{mathbf{t}}$ 表示滿足右手定則的單位法向量。
向量插值
這里僅討論兩種向量插值技術:線性插值和球形插值。線性插值的路徑是直線,球形插值的路徑是圓形或者曲線。
線性插值
線性插值非常直觀,已知兩個向量,給這兩個向量各分配一個權重相加,權重和為 1。令插值得到的向量為 $v(t)$,則
$$v(t)=(1-t)v_1+tv_2=v_1+t(v_2-v_1)$$
其中 $tin [0,1]$,當 $t=0$ 時,$v(t)=v_1$,當 $t=1$ 時,$v(t)=v_2$。
根據上式中的第二個等號,可以利用幾何的方法推斷出插值的路徑:
$(v_2-v_1)$ 就是 $v_1$ 箭頭端點指向 $v_2$ 箭頭端點的向量,而$t(v_2-v_1)$ 的箭頭端點就在這個向量表示的線段上移動。通過與 $v_1$ 相加后發現,插值出來的 $v(t)$ 的箭頭端點也在這條線段上,這就是線性插值的路徑。
通過圖示我們可以看到,這種線性插值在當兩個向量大小相等時,無法保證插值向量的大小不變,在很多應用中我們其實希望這個向量大小是穩定的。比如 $v_1$ 和 $v_2$ 假設表示一條手臂在 $t_1$ 時刻和 $t_2$ 時刻的位置狀態的話,我們希望插值得到 $t_1$ 和 $t_2$ 時刻之間的手臂的位置狀態,如果用線性插值,我們會發現這個本來長度固定不變的手臂,插值后長度竟然發生變化了。
這就引入了球形插值。
球形插值
球形插值的推導過程暫且不表,但是其核心思想是加入了這樣的限制條件:兩個單位向量插值出來必然也是單位向量,進而保證了我們希望長度穩定的需求。
如果兩個向量大小相同,它的插值路徑是圓形;如果向量大小不同,則插值路徑是曲線。一些例子:
插值公式如下:
$$v(t)=frac{sin(1-t) heta}{sin heta}v_1+frac{sint heta}{sin heta}v_2$$
其中,$tin [0,1]$,當 $t=0$ 時,$v(t)=v_1$,當 $t=1$ 時,$v(t)=v_2$。而 $ heta$ 是 $v_1$ 和 $v_2$ 的夾角,可以通過點乘的公式計算余弦。
參考
維基百科:數量積
維基百科:叉積
Vector Calculus: Understanding the Dot Product
Vector Calculus: Understanding the Cross Product
探討:向量(方向)之間的插值-四元數法VS.旋轉矩陣法的性能比較
《Rotation Transforms for Computer Graphics》byJohn Vince
總結
以上是生活随笔為你收集整理的【几何系列】向量:向量乘法(标量积、向量积)和向量插值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM PSCI在ATF和Linux k
- 下一篇: 怎样通过反编译工具与插件 查看java