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