請預(yù)定了我們游戲引擎課程的同學(xué)滚粟,務(wù)必強(qiáng)迫自己至少瀏覽一遍所有內(nèi)容,因?yàn)檫@些心法口訣將時(shí)時(shí)刻刻體現(xiàn)在整個(gè)游戲引擎的設(shè)計(jì)中草慧。
向量的長度
現(xiàn)在我們已經(jīng)解釋了關(guān)于坐標(biāo)系系統(tǒng)的一些東西刽严,我們接下來可以來看看最常見的一些被用到點(diǎn)和向量上的操作了皇筛。在任何3D程序或者渲染器中,這些操作應(yīng)該都是非常常見的社痛。
單位化一個(gè)向量
如同我們前面介紹的那樣见转,在3D空間中,一個(gè)向量可以被看成是一個(gè)從一個(gè)點(diǎn)指向另一個(gè)點(diǎn)的箭頭蒜哀。這個(gè)向量不僅僅指明了從A指向B的方向斩箫,同時(shí)還可以被用來計(jì)算AB兩點(diǎn)之間的距離。值得注意的是撵儿,我們的坐標(biāo)軸通常那幾根基向量都是單位向量乘客。
一個(gè)單位化過的向量的長度是1,這樣的向量被稱為單位向量淀歇。單位化一個(gè)向量是非常簡單的易核。我們用它的每一個(gè)分量去除以它的長度就可以了。
在數(shù)學(xué)里浪默,你可能會(huì)發(fā)現(xiàn)一個(gè)叫做norm的詞牡直,它定義了一個(gè)函數(shù)可以用來指定一個(gè)向量的長度缀匕。剛才我們講的這個(gè)函數(shù)被稱為歐幾里德范數(shù)。
點(diǎn)乘
點(diǎn)乘兩個(gè)向量在數(shù)學(xué)中可以表示為A·B碰逸,兩個(gè)向量的點(diǎn)乘會(huì)得到一個(gè)數(shù)乡小。我們在這里討論的都是實(shí)數(shù)范圍內(nèi)的向量乘法。點(diǎn)乘是讓每個(gè)向量的各個(gè)部分分別求積后再加起來饵史。
在任何3D程序或者渲染器中满钟,兩個(gè)向量進(jìn)行點(diǎn)乘是非常重要的操作,因?yàn)辄c(diǎn)乘最終得到了一個(gè)關(guān)于cos的式子约急,我們很多時(shí)候都需要這個(gè)cos來做一些后續(xù)的運(yùn)算零远。比如點(diǎn)乘可以用來檢測兩個(gè)向量是否互相垂直,如果互相垂直厌蔽,那么點(diǎn)乘的結(jié)果就是0牵辣。當(dāng)點(diǎn)乘的結(jié)果是-1的時(shí)候,那么兩個(gè)向量剛好方向相反奴饮。如果點(diǎn)乘的結(jié)果是1的時(shí)候纬向,則表示,兩個(gè)向量剛好指向完全相同的方向上戴卜。同樣點(diǎn)乘還可以用來去表示兩個(gè)向量間的夾角或者一個(gè)向量與某個(gè)坐標(biāo)軸之間的夾角逾条。
叉乘
叉乘同樣也是對兩個(gè)向量進(jìn)行操作。與點(diǎn)乘不一樣的是投剥,相較于點(diǎn)乘的結(jié)果是個(gè)數(shù)字师脂,叉乘的結(jié)果是一個(gè)向量。并且江锨,得到的這個(gè)向量同時(shí)垂直于參與進(jìn)行叉乘的兩個(gè)向量吃警。叉乘的數(shù)學(xué)表示為:
C = A x B
得到的C矩陣跟A和B互相正交。如果用A和B定義一個(gè)平面的話啄育,C就垂直于A與B所在的平面酌心。叉乘中,乘法的順序非常重要挑豌,A叉乘B和B叉乘A的結(jié)果是不一樣的安券。
這也就是說,叉乘是不滿足乘法交換律氓英。
其他的運(yùn)算-加法侯勉、減法
加法和減法用在點(diǎn)上意義比較直觀。就是挪動(dòng)點(diǎn)的位置铝阐。但向量之間進(jìn)行加法和減法運(yùn)算壳鹤,就不是那么回事了。有些3D的API會(huì)區(qū)分點(diǎn)饰迹、法線芳誓、向量的這些運(yùn)算余舶。因此,確實(shí)可以去創(chuàng)建點(diǎn)锹淌、法線匿值、向量這三個(gè)完全不同的C++的類。比如法線不會(huì)像點(diǎn)和向量那樣被轉(zhuǎn)換赂摆。兩個(gè)點(diǎn)相減挟憔,很明顯可以產(chǎn)生一個(gè)向量。把一個(gè)向量加到另一個(gè)向量或者點(diǎn)上烟号,會(huì)產(chǎn)生一個(gè)點(diǎn)等等這類的區(qū)別绊谭。但是有的人也認(rèn)為這么干會(huì)增加代碼的復(fù)雜度。所以在咱們的戰(zhàn)火引擎種并沒有對他們做明確的區(qū)分汪拥,但使用者必須知道他們數(shù)學(xué)意義上的區(qū)別达传。
由于微信公眾號每個(gè)月只能群發(fā)四次,所以下個(gè)月開始我們將開始發(fā)布雞翅膀風(fēng)格的文章迫筑,我們同樣會(huì)提供原文鏈接宪赶。如果大家不想錯(cuò)過每一篇文章,請關(guān)注我們的官方網(wǎng)站上的各類書籍文字閱讀部分脯燃。
我們的官網(wǎng): https://edu.battlefire.cn/
我們的網(wǎng)易云課堂:https://study.163.com/series/1001365003.htm