一文讀懂矢量運(yùn)算
在游戲編程或者傳統(tǒng)三維軟件中,點(diǎn)和矢量是特別容易混淆的,因?yàn)樗鼈兊谋硎痉椒ǘ家粯印1热缫粋€點(diǎn)P,它的坐標(biāo)表示為P=(x,y,z),但是矢量的表示方法也是如此,那它們到底有什么區(qū)別呢?
點(diǎn)表示的是空間中的一個位置,它沒有方向、大小、長度這類的概念。
而矢量是一段包含了長度(又叫做模)和方向的有向線段,它也經(jīng)常被稱為向量。我們常說的速度,就是一種典型的矢量。
與矢量形成對比的,叫做標(biāo)量。標(biāo)量是一種只有長度、沒有方向的數(shù)學(xué)概念。生活中常提到的距離,它其實(shí)就是一種標(biāo)量。
在這里,我們主要了解矢量,因?yàn)樗灤┯谟螒蚓幊痰氖冀K。對于矢量來說,只有它的模和方向保持不變,無論放在任何位置,都是同一個矢量。比如說下面的矢量a 和 矢量b,盡管它們在坐標(biāo)系中的位置不同,但是它們的模和方向都是相同的,因此,它們是同一個矢量。矢量通常被用于表示相對于某個點(diǎn)的偏移。
矢量可以和矢量做運(yùn)算,也可以和標(biāo)量做運(yùn)算。
矢量和標(biāo)量的乘/除法
矢量和標(biāo)量的運(yùn)算比較簡單,它們之間只能做乘除法,不能做加減法。矢量和標(biāo)量相乘,只需要矢量的每個分量和標(biāo)量相乘即可,而矢量除以標(biāo)量,相當(dāng)于乘以標(biāo)量的倒數(shù)。
從幾何意義來看,矢量乘以一個正標(biāo)量k,相當(dāng)于將矢量擴(kuò)大了k倍,方向不變;而乘以一個負(fù)標(biāo)量,矢量不僅擴(kuò)大了|k|倍,方向也會取反。
矢量的加/減法
兩個矢量相加減,只需要將每個矢量的對應(yīng)分量相加減即可,最后的結(jié)果是得到一個新矢量。
矢量的加減法,它表達(dá)的是偏移的幾何意義。
以加法為例,矢量a + 矢量b,它表示的是:一個點(diǎn),從a的起始位置出發(fā),便偏移了a,接著又偏移了b,就等同于進(jìn)行了一個a+b的位移。這里的矢量a、b,它們的首尾是相連的。
如果a、b首尾不相連,就變成了減法,a-b,表示的是a相對于b的偏移。
矢量的點(diǎn)積
矢量之間也可以進(jìn)行乘法,通常有兩種類型:點(diǎn)積和叉積。先來說說點(diǎn)積。
矢量的點(diǎn)積有兩種公式,第一種是矢量之間對應(yīng)分量的乘積之和,也就是:
從公式可以看出,點(diǎn)積是滿足乘法交換律的,也就是a*b = b*a。
點(diǎn)積可以用來判斷兩個矢量之間的方向夾角關(guān)系。
如果 a * b > 0,說明a和b是銳角關(guān)系;
如果 a * b = 0,說明a和b是直角關(guān)系;
如果 a * b < 0,說明a和b是鈍角關(guān)系;
在游戲編程中,也通常使用點(diǎn)積來計算投影,這和求矢量方向夾角是同一個道理。
另外,點(diǎn)積可以和標(biāo)量進(jìn)行乘法運(yùn)算,并且符合乘法的結(jié)合律。
點(diǎn)積還可以結(jié)合矢量加法做運(yùn)算,相當(dāng)于求點(diǎn)積之和。
一個矢量和本身進(jìn)行點(diǎn)積,結(jié)果是這個矢量模的平方。
這里有說到矢量的模,它的求法等于矢量各分量的平方和開根號,即:
另外,模為1的矢量,被稱為單位矢量,也叫做歸一化矢量。
矢量的第二種公式是:
矢量的叉積
矢量的另一種乘法運(yùn)算叫做叉積,和點(diǎn)積不同的是,叉積的結(jié)果仍然是一個矢量,而非標(biāo)量。
兩個矢量的叉積用a X b來表示,這個x號不同于數(shù)學(xué)的乘號,這點(diǎn)不要混淆。叉積計算也有兩種公式,第一種是:
叉積不滿足交換律,即 a X b ≠ b X a,但它滿足反交換律,即a X b = -( b X a)
叉積也不滿足結(jié)合律,即 (a X b) X c ≠ a X (b X c)
從幾何意義來講,兩個矢量叉積的結(jié)果,會得到一個同時垂直于這兩個矢量的新矢量,這個新矢量的模很好計算,既可以通過模公式來得到,也可以通過矢量a、b以及他們之間的夾角θ來得到
對于新矢量的方向,它可能存在兩個完全相反的方向,要確定具體哪個方向,就要看使用的左手坐標(biāo)系還是右手坐標(biāo)系。
要求a X b 新矢量的方向,如果是左手坐標(biāo)系,伸直左手拇指微握其他四指,指背與矢量a方向垂直,四指彎曲方向朝矢量b靠攏,這是拇指指向的方向,就是新矢量的方向。
同樣地,如果是右手坐標(biāo)系,則伸出右手按照同樣的法則來判斷方向。
叉積在游戲編程中,經(jīng)常用于計算垂直于一個平面、三角形的矢量。另外,還可以用于判斷三角面片的朝向。