因為我們要寫的是3D遊戲程序,所以,我們必須要接觸兩個數學方面的難點知識——向量和矩陣。
有的人問:這個這麼難,我們可不可以不學?
我的答案是這樣的:如果你是有心要學習本課程,那麼這個是必須要學習的,是沒有道理可講的,是想破了腦袋也要學明白的。
那麼,不學可不可以寫出3D遊戲來呢?其實是可以的。市面上有太多的3D遊戲引擎了,這些3D引擎把遊戲編程中比較複雜的工作都幫我們做了,只是把一些比較簡單的工作留給了我們。這樣的話,只需要點幾下滑鼠,添加一些遊戲素材,像本課程這樣的3D遊戲示例一下子就能生成很多個。但是,真的用遊戲引擎的話,不管是新手還是孩子,一點有用的東西都學不到。3D遊戲引擎,是給專業人士開發超大型3D遊戲用的,不是給新手們「娛樂」用的。而且,如果一個程式設計師不懂得3D遊戲編程的基礎內容,給他再好的3D遊戲引擎,他也用不明白。
所以,我們還是安下心來學習這兩個重要的數學知識點吧。
首先,我們把向量這個知識點講明白。
「學」的部分
我們光看名字就知道,「3D遊戲編程」的重點在「3D」,就是說,程式設計師要面對的大多數問題都和「3D」有關係。再具體一些,這些和「3D」有關係的問題,基本上是3D內容的顯示和3D物體的運動模擬。
在上一節的內容中我們已經了解,計算機是在3D坐標系中處理3D問題的,也就是說,不管是3D內容顯示還是3D物體的運動模擬都會牽扯到非常非常複雜的數學計算。
說個最簡單的例子。假設你的遊戲中有一隻小鳥在飛,你要模擬它飛行的過程,那麼,我們就要計算單位時間內小鳥的位置。由於是3D坐標系,我們需要分別計算x、y、z三個分量的值。這裡說起來容易,真的要用代碼實現的話,你會發現非常繁瑣。
通過前面的章節你已經了解,程式設計師是最會偷懶的一群人,一旦某個「解題」方法太繁瑣的話,程式設計師就會想方設法去簡化它。面對上面的3D問題,程式設計師們早就找到了解決方法,而這個解決方法,就是數學中的向量。
什麼是向量呢?往簡單了說,就是可以把多維的計算問題簡化成一維的計算問題。還是上面的小鳥,如果小鳥只是在一維空間飛行的話,計算會非常簡單,只是牽扯到最基礎的加減法。而一個3D環境下的小鳥,如果用向量來表示各種屬性的話,所有的計算就會變得和一維中一樣簡單。小鳥的位置可以用向量A來表示,小鳥的飛行方向可以用向量B來表示,在計算小鳥下一時刻的位置時,我們只需要通過計算向量A和向量B的加減乘法就可以了,就和解決一維問題一樣方便。
如果光看數字的話,向量似乎很簡單,三維向量就是一對括號中有3個分開的數字罷了,比方說向量A可以是下面這個樣子:
(1,2,3)
不要小看這個「數字組合」,它是計算機3D遊戲編程中不可或缺的內容,沒有它,遊戲編程幾乎就變得不可能了。
關於向量,我們還需要明白3個要點。
要點一:如何理解三維向量
在三維空間中,向量可以理解成一個「有一定長度的箭頭」。比方說上面的向量(1,2,3),要怎麼在三維坐標系中畫出來呢?具體的方法如下:
1.在x軸上找到1的位置,並標一個點D;
2.然後把點D沿著y軸正方向移動2個單位;
3.接下來把點D沿著z軸方向移動3個單位,這個點就到達預定位置了;
4.最後,把原點和D點連接起來,並在D點上標上箭頭的標誌,三維坐標系下的向量(1,2,3)就畫好了。
也就是說,任何一個三維向量,起點都在原點上,我們只需要根據括號中的3個標量找到目標D點,然後連一條有方向的線就可以了。
要點二:向量只有大小和方向,沒有位置
其實,只要我們在三維空間中任意確定兩個點,然後連成一條有方向的線就是向量了,因為我們在生活中就是這麼做的。比方說最常見的交通指示標誌,地上的箭頭就可以看成是一個向量。但是,我們無法確定原點的位置,只能把箭頭的起點當原點了。數學是抽象,抽象也要尊重事實。而向量就是一個抽象,其中的事實就是原點無法確定,乾脆,數學中的向量就變成了一個沒有位置的量了。你可以這麼理解:在3D坐標系中隨便畫一個向量A,然後,我們可以把這個向量任意移動,只要不改變它的方向,這個向量還是原來的向量A。