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