請預(yù)定了我們游戲引擎課程的同學(xué)界酒,務(wù)必強(qiáng)迫自己至少瀏覽一遍所有內(nèi)容昔脯,因?yàn)檫@些心法口訣將時時刻刻體現(xiàn)在整個游戲引擎的設(shè)計(jì)中。
向量的長度
現(xiàn)在我們已經(jīng)解釋了關(guān)于坐標(biāo)系系統(tǒng)的一些東西骡楼,我們接下來可以來看看最常見的一些被用到點(diǎn)和向量上的操作了腌歉。在任何3D程序或者渲染器中,這些操作應(yīng)該都是非常常見的避除。
單位化一個向量
如同我們前面介紹的那樣怎披,在3D空間中,一個向量可以被看成是一個從一個點(diǎn)指向另一個點(diǎn)的箭頭驹饺。這個向量不僅僅指明了從A指向B的方向钳枕,同時還可以被用來計(jì)算AB兩點(diǎn)之間的距離。值得注意的是赏壹,我們的坐標(biāo)軸通常那幾根基向量都是單位向量鱼炒。
一個單位化過的向量的長度是1,這樣的向量被稱為單位向量蝌借。單位化一個向量是非常簡單的昔瞧。我們用它的每一個分量去除以它的長度就可以了指蚁。
在數(shù)學(xué)里,你可能會發(fā)現(xiàn)一個叫做norm的詞自晰,它定義了一個函數(shù)可以用來指定一個向量的長度凝化。剛才我們講的這個函數(shù)被稱為歐幾里德范數(shù)。
點(diǎn)乘
點(diǎn)乘兩個向量在數(shù)學(xué)中可以表示為A·B酬荞,兩個向量的點(diǎn)乘會得到一個數(shù)搓劫。我們在這里討論的都是實(shí)數(shù)范圍內(nèi)的向量乘法。點(diǎn)乘是讓每個向量的各個部分分別求積后再加起來混巧。
在任何3D程序或者渲染器中枪向,兩個向量進(jìn)行點(diǎn)乘是非常重要的操作,因?yàn)辄c(diǎn)乘最終得到了一個關(guān)于cos的式子咧党,我們很多時候都需要這個cos來做一些后續(xù)的運(yùn)算秘蛔。比如點(diǎn)乘可以用來檢測兩個向量是否互相垂直,如果互相垂直傍衡,那么點(diǎn)乘的結(jié)果就是0深员。當(dāng)點(diǎn)乘的結(jié)果是-1的時候,那么兩個向量剛好方向相反蛙埂。如果點(diǎn)乘的結(jié)果是1的時候倦畅,則表示,兩個向量剛好指向完全相同的方向上箱残。同樣點(diǎn)乘還可以用來去表示兩個向量間的夾角或者一個向量與某個坐標(biāo)軸之間的夾角滔迈。
叉乘
叉乘同樣也是對兩個向量進(jìn)行操作。與點(diǎn)乘不一樣的是被辑,相較于點(diǎn)乘的結(jié)果是個數(shù)字,叉乘的結(jié)果是一個向量敬惦。并且盼理,得到的這個向量同時垂直于參與進(jìn)行叉乘的兩個向量。叉乘的數(shù)學(xué)表示為:
C = A x B
得到的C矩陣跟A和B互相正交俄删。如果用A和B定義一個平面的話宏怔,C就垂直于A與B所在的平面。叉乘中畴椰,乘法的順序非常重要臊诊,A叉乘B和B叉乘A的結(jié)果是不一樣的。
這也就是說斜脂,叉乘是不滿足乘法交換律抓艳。
其他的運(yùn)算-加法、減法
加法和減法用在點(diǎn)上意義比較直觀帚戳。就是挪動點(diǎn)的位置玷或。但向量之間進(jìn)行加法和減法運(yùn)算儡首,就不是那么回事了。有些3D的API會區(qū)分點(diǎn)偏友、法線蔬胯、向量的這些運(yùn)算。因此位他,確實(shí)可以去創(chuàng)建點(diǎn)氛濒、法線、向量這三個完全不同的C++的類鹅髓。比如法線不會像點(diǎn)和向量那樣被轉(zhuǎn)換舞竿。兩個點(diǎn)相減,很明顯可以產(chǎn)生一個向量迈勋。把一個向量加到另一個向量或者點(diǎn)上炬灭,會產(chǎn)生一個點(diǎn)等等這類的區(qū)別。但是有的人也認(rèn)為這么干會增加代碼的復(fù)雜度靡菇。所以在咱們的戰(zhàn)火引擎種并沒有對他們做明確的區(qū)分重归,但使用者必須知道他們數(shù)學(xué)意義上的區(qū)別。
有興趣的關(guān)注我們的公眾號--圖形之心厦凤。由于微信公眾號每個月只能群發(fā)四次鼻吮,所以下個月開始我們將開始發(fā)布雞翅膀風(fēng)格的文章,我們同樣會提供原文鏈接较鼓。如果大家不想錯過每一篇文章椎木,請關(guān)注我們的官方網(wǎng)站上的各類書籍文字閱讀部分。