在游戲編程或者傳統(tǒng)三維軟件中痹换,點和矢量是特別容易混淆的征字,因為它們的表示方法都一樣。比如一個點P娇豫,它的坐標表示為P=(x,y,z)匙姜,但是矢量的表示方法也是如此,那它們到底有什么區(qū)別呢冯痢?
點表示的是空間中的一個位置氮昧,它沒有方向、大小浦楣、長度這類的概念袖肥。
而矢量是一段包含了長度(又叫做模)和方向的有向線段,它也經(jīng)常被稱為向量振劳。我們常說的速度椎组,就是一種典型的矢量。
與矢量形成對比的历恐,叫做標量寸癌。標量是一種只有長度专筷、沒有方向的數(shù)學概念。生活中常提到的距離蒸苇,它其實就是一種標量磷蛹。
在這里,我們主要了解矢量溪烤,因為它貫穿于游戲編程的始終味咳。對于矢量來說,只有它的模和方向保持不變檬嘀,無論放在任何位置槽驶,都是同一個矢量。比如說下面的矢量a 和 矢量b枪眉,盡管它們在坐標系中的位置不同,但是它們的模和方向都是相同的再层,因此贸铜,它們是同一個矢量。矢量通常被用于表示相對于某個點的偏移聂受。
矢量可以和矢量做運算蒿秦,也可以和標量做運算。
矢量和標量的乘/除法
矢量和標量的運算比較簡單蛋济,它們之間只能做乘除法棍鳖,不能做加減法。矢量和標量相乘碗旅,只需要矢量的每個分量和標量相乘即可渡处,而矢量除以標量,相當于乘以標量的倒數(shù)祟辟。
從幾何意義來看医瘫,矢量乘以一個正標量k,相當于將矢量擴大了k倍旧困,方向不變醇份;而乘以一個負標量,矢量不僅擴大了|k|倍吼具,方向也會取反僚纷。
矢量的加/減法
兩個矢量相加減,只需要將每個矢量的對應分量相加減即可拗盒,最后的結(jié)果是得到一個新矢量怖竭。
矢量的加減法,它表達的是偏移的幾何意義陡蝇。
以加法為例侵状,矢量a + 矢量b赞弥,它表示的是:一個點,從a的起始位置出發(fā)趣兄,便偏移了a绽左,接著又偏移了b,就等同于進行了一個a+b的位移艇潭。這里的矢量a拼窥、b,它們的首尾是相連的蹋凝。
如果a鲁纠、b首尾不相連,就變成了減法鳍寂,a-b改含,表示的是a相對于b的偏移。
矢量的點積
矢量之間也可以進行乘法迄汛,通常有兩種類型:點積和叉積捍壤。先來說說點積。
矢量的點積有兩種公式鞍爱,第一種是矢量之間對應分量的乘積之和鹃觉,也就是:
從公式可以看出,點積是滿足乘法交換律的睹逃,也就是a * b = b * a盗扇。
點積可以用來判斷兩個矢量之間的方向夾角關系。
如果 a * b > 0,說明a和b是銳角關系沉填;
如果 a * b = 0,說明a和b是直角關系疗隶;
如果 a * b < 0,說明a和b是鈍角關系;
在游戲編程中翼闹,也通常使用點積來計算投影抽减,這和求矢量方向夾角是同一個道理。
另外橄碾,點積可以和標量進行乘法運算卵沉,并且符合乘法的結(jié)合律。
點積還可以結(jié)合矢量加法做運算法牲,相當于求點積之和史汗。
一個矢量和本身進行點積,結(jié)果是這個矢量模的平方拒垃。
這里有說到矢量的模停撞,它的求法等于矢量各分量的平方和開根號,即:
另外,模為1的矢量戈毒,被稱為單位矢量艰猬,也叫做歸一化矢量。
矢量的第二種公式是:
矢量的叉積
矢量的另一種乘法運算叫做叉積埋市,和點積不同的是冠桃,叉積的結(jié)果仍然是一個矢量,而非標量道宅。
兩個矢量的叉積用a X b來表示食听,這個x號不同于數(shù)學的乘號,這點不要混淆污茵。叉積計算也有兩種公式樱报,第一種是:
叉積不滿足交換律,即 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以及他們之間的夾角θ來得到
對于新矢量的方向章喉,它可能存在兩個完全相反的方向,要確定具體哪個方向身坐,就要看使用的左手坐標系還是右手坐標系秸脱。
要求a X b 新矢量的方向,如果是左手坐標系部蛇,伸直左手拇指微握其他四指摊唇,指背與矢量a方向垂直,四指彎曲方向朝矢量b靠攏涯鲁,這是拇指指向的方向巷查,就是新矢量的方向。
同樣地抹腿,如果是右手坐標系岛请,則伸出右手按照同樣的法則來判斷方向。
叉積在游戲編程中警绩,經(jīng)常用于計算垂直于一個平面崇败、三角形的矢量。另外,還可以用于判斷三角面片的朝向后室。