教孩子寫遊戲:3D遊戲編程的必備數學知識,理解三維空間向量

2020-12-08 我是遊戲小胡

因為我們要寫的是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。

相關焦點

  • 教孩子寫遊戲:3D遊戲編程離不開矩陣,我們要如何理解矩陣?
    雖然說,我們不需要對矩陣有非常深入的理解,但是,這並不代表著我們可以不學矩陣。這麼說吧,如果你對矩陣一無所知,那麼,整個3D遊戲編程你是學不懂的。你可以靠著強大的記憶力把本課程的代碼記住,並且也能通過自己的摸索寫出類似的3D遊戲來,但是,你對其中的原理是不理解的,將來想要寫功能更強大的3D遊戲,就純粹是天方夜譚了。
  • 程序猿必備基礎知識+高頻面試類型之3D數學
    三維數學跟數據結構與算法一樣地重要,同樣都是程式設計師必備知識,也是高頻面試類型。掌握好三維數學,再處理一些圖形,或者空間信息的時候,可以得心應手。下面是三維數學必備的幾個知識點,程序猿們好好地去掌握吧,下面用unity開發引擎來作為演示,unity是左手坐標系的:
  • 教孩子寫遊戲:計算機語言那麼多,為何3D遊戲編程偏愛C++語言?
    我們只是用C++這個語言來寫遊戲而已,而且,用到的C++知識不是特別多,我們只要讓小孩子懂得如何用就行,並不需要讓他們理解用的背後那複雜的真諦。相對於很多語言來講,C++的語法並不是很難,只要不深入,問題不是很大。額外提一句,我們完全可以把C++語言理解成是C語言的優化版本。
  • 教孩子寫遊戲:矩陣在3D遊戲編程中是如何被使用的?
    我一直把某一個道理信奉為真理:如果你覺得某個問題難以解決,不妨好好去學一學數學,沒準兒,數學家在好幾百年前就已經有了解決方法了。矩陣就是這樣,當時被發明出來的時候很多人並不理解,一個快速計算方法有什麼用?
  • 教孩子寫遊戲:遊戲編程,「學」是一部分,關鍵在於「習」
    雖然編程是一項腦力勞動,但是這項腦力勞動歸根結底是建立在一定的基礎內容之上的。除非是超級天才,否則沒有哪一個程式設計師能夠不靠前人的基礎編程成果來寫程序。所以,想要讓寫程序從體力勞動變成腦力勞動,必須有異常紮實的基本功。
  • 教孩子寫遊戲:在Windows下寫3D遊戲,為什麼需要DirectX?
    有了框架之後,我們就可以把遊戲內容寫在窗口之中了。那麼,接下來,我們要直接開始寫遊戲核心內容嗎?我想,你的答案和我一樣:不是的。因為我們要寫一個3D的小遊戲示例,即便這個示例再簡單,也包含了巨量的知識點,在你不了解這些知識點之前,你面對3D遊戲的核心代碼就和看天書差不多。
  • 尼基丁心智促進遊戲:引導孩子通向三維空間的第一步
    我們上周介紹過的模型方塊,著眼於孩子平面空間思維培養。接下來,組合方塊遊戲就將帶領孩子進入神奇的三維空間。這一遊戲擁有令人驚嘆的廣泛任務,從2歲的孩子,到80歲的老奶奶,都能充滿激情,全身心投入其中。它所具有的豐富的數學學習內容,還可以激發孩子濃厚的數學學習興趣。
  • 張泉靈《知識春晚》強推編程貓:為什麼遊戲化教學有助學編程
    作為《知識春晚》唯一合作的頭部少兒編程教育品牌,編程貓參與了「教好娃」主題環節,和羅振宇、張泉靈兩位知識界大咖互動討論,分享人工智慧時代,如何用科技「教好娃」。《知識春晚》一共挖掘了9個大眾最關心的主題,其中「教好娃」成為無數父母的剛需問題。多位育兒專家從如何讓孩子愛上寫作文?怎樣應付「青春期」的孩子多個方面給大家分享了一些故事,提供了一些實用的「教娃」技巧。
  • 遊戲引擎開發涉及到的數學知識
    數學可以說是引擎的根基,它的作用是不言而喻的。
  • 教孩子寫遊戲:我們將要編寫的這個3D遊戲程序什麼樣?
    如果說,這是一套教你寫一個2D遊戲的教程,那麼這一章就是多餘的。可我們學的是3D遊戲編程,提前知道最終的遊戲會寫成什麼樣子,對你接下來的學習過程是有很大幫助的。通過上一節的內容,我們已經知道,3D遊戲的編寫過程,就是模擬「拍電影」的過程,只不過,一切需要的「道具」都需要程式設計師自己去「虛擬化」。
  • 少兒遊戲編程:孩子學習遊戲編程有哪些好處?
    其實,孩子一旦接觸手機,就不可能有折中的狀態。有一個非常古老的辦法,就是另外找一個刺激點,把孩子的興趣從手機遊戲上吸引過來。如果這個新的刺激點是學習某項內容,豈不是很完美?我個人的建議是,把孩子的興趣從玩遊戲轉移到製作遊戲上,也就是說,我們通過教孩子如何編寫電腦遊戲,來轉移孩子的注意力。
  • 教孩子寫遊戲:作為新手,要如何理解遊戲中的3D世界呢?
    坐標系對於你來說,是很容易理解的事情,但是,對於一個孩子來講,可能有點麻煩,所以,關於如何讓孩子更容易理解坐標系,我放在文章最後專門講解。在這裡,我先假定,你是大學本科的水平。不是所有本科生都特別明白3D坐標系的,但是,平面的2D坐標系應該都懂,否則你也考不上大學。所以,我還是先簡單說一說什麼是3D坐標系。
  • 教孩子寫遊戲:如何通俗地讓孩子明白遊戲在電腦上的運行過程?
    要把計算機的工作原理理解透徹,幾乎和了解一項「世紀工程」一樣難。理解透徹的意思,不僅僅是要懂得普通程序的運行過程,而且還要懂得這些運算過程是如何變成計算機加法的,甚至還要懂得CPU的電流結構。我想,絕大部分人就算花一輩子的時間也難全面了解。但是,我們要寫程序,一定要懂得程序的運行過程,否則寫程序的時候容易一頭霧水。
  • 教孩子寫遊戲:什麼是作業系統?它和程式語言有什麼關係?
    你可以這樣理解:假設計算機一共有100個基礎功能,這些基礎功能都是控制計算機某個硬體的功能,比方說控制CPU或者是內存的功能。雖然這些功能看起來很簡單,可是,要用數學的方法來實現這些功能是非常不容易的,況且這個數學只是二進位的加法而已。拿DOS系統來說,它包含了這100個基礎功能的所有機器語言代碼。
  • Github霸榜:從零開始學3D著色器編程
    主要介紹了通過使用Panda3D遊戲引擎和OpenGL著色語言來為3D遊戲添加紋理,法線貼圖,泛光,環境遮擋等等。教程內容十分豐富,動圖也非常生動。Shader,是運行在GPU上的程序,中文稱為著色器。它的主要用途是對三維物體進行著色處理,對光與影進行計算,以及控制紋理顏色的呈現等,最終,將遊戲引擎中的幾何數據轉化為屏幕上的模型、場景以及特效。
  • Unity遊戲開發 向量在遊戲開發中的應用(一)
    ,我們在學校學完向量的知識後,只知道向量的基本知識,但對於如何將所學到的向量知識運用到實際的遊戲開發中卻不知所措。我計劃寫幾篇關於向量在遊戲中的應用的文章,總結一下在實際工作中所遇到過的運用向量機智處理問題的技巧。接下來要寫的東西都是記錄在我的雲筆記中,現在計劃整理一下後分享出來。對於向量的那些基本性質我不想說太多,有興趣的讀者可以自行查閱相關文檔,這裡只說向量的大小和方向。
  • 你理解錯了,葡萄科技科技玩具Hello編程不是教孩子寫代碼
    孩子沉迷 iPad 怎麼辦?今天就給大家介紹一款葡萄科技的智能玩具:葡萄探索號套裝,包括探索號主機,Hello 編程、哈尼海洋和麥斯絲三個遊戲套裝。它將玩具和 App 遊戲相互結合,通過 AR 和圖像識別技術,讓孩子在科技遊戲中啟迪智慧,雖然還是通過 iPad 來實現,但是AR的技術讓孩子的目光不再聚焦在屏幕上啦。
  • 3D遊戲編程:Direct3D幫我們做了哪些事情?
    尤其是會寫3D遊戲的老程式設計師,目光是非常高的,他們甚至會看不起DirectX!DirectX的技術中,讓所有程式設計師都佩服的地方有兩個:其一,就是COM技術;其二,是DirectX虛擬了所有的硬體,讓遊戲編程不再考慮繁瑣的硬體控制。
  • 擔心孩子數學學不好?不妨在幼兒園就玩這些數學思維遊戲
    我們需要用數學來解決運算、程序、邏輯推理等問題。在幼兒園期間,老師們不僅要有意識地去培養孩子們的數學思維,更要讓孩子們喜歡數學,讓孩子知道數學是好玩、有趣的。我們都知道孩子的右腦是通過圖像進行思考的半球,家長可以通過右腦訓練遊戲來開發孩子的潛能。
  • 教孩子寫遊戲:稍微深入了解一下DirectX
    遊戲編程和其他編程不同的地方在於,遊戲編程對程式設計師的要求更高。說一句不太好聽的話:一般的編程都有例子可以「抄」。我相信,很多人都在網上看過類似這樣的段子:A:最近好累,寫程序寫得頭大!B:累?寫程序不都是複製粘貼嗎?