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

2020-12-04 我是遊戲小胡

因為我們要寫的是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遊戲編程中是如何被使用的?
    我一直把某一個道理信奉為真理:如果你覺得某個問題難以解決,不妨好好去學一學數學,沒準兒,數學家在好幾百年前就已經有了解決方法了。矩陣就是這樣,當時被發明出來的時候很多人並不理解,一個快速計算方法有什麼用?直到有了計算機,直到程式設計師在處理計算機3D問題時遇到了非常大困難的時候,大家才發現矩陣的真正用處——它能大大提高3D問題中複雜計算的效率。
  • 程序猿必備基礎知識+高頻面試類型之3D數學
    三維數學跟數據結構與算法一樣地重要,同樣都是程式設計師必備知識,也是高頻面試類型。掌握好三維數學,再處理一些圖形,或者空間信息的時候,可以得心應手。下面是三維數學必備的幾個知識點,程序猿們好好地去掌握吧,下面用unity開發引擎來作為演示,unity是左手坐標系的:
  • 學習少兒編程有什麼好處?讓孩子在遊戲中思考並理解邏輯
    少兒編程的初衷是讓兒童學習和考慮基於手機遊戲的訓練。不同的實際操作構成了遊戲的整個過程,會產生不同的實際效果。設定遊戲訓練目標時,如何制定目標,這就像積木遊戲一樣,讓孩子在遊戲中思考並理解邏輯。
  • 教孩子寫遊戲:作為新手,要如何理解遊戲中的3D世界呢?
    第一步:明白什麼是坐標系我們已經明白,所謂的虛擬3D世界,其實就是一堆數學的數字而已,只不過,這堆數字有一定的規律罷了,而一切規律的基礎,就是坐標系了。坐標系對於你來說,是很容易理解的事情,但是,對於一個孩子來講,可能有點麻煩,所以,關於如何讓孩子更容易理解坐標系,我放在文章最後專門講解。在這裡,我先假定,你是大學本科的水平。
  • 教孩子背數字≠理解數字,正確認識數學意識,學學這幾個小遊戲
    數學這門學科是很多知識的起源,從人類文明開始發展,我們生活中的很多事就都離不開數字和數學了。教孩子數數、認識數字,是孩子的「人生第一課」,這項任務一般都落在了父母身上。教孩子數數,會背「1、2、3」,但是總是不理解數字的真正含義小藝最近在教寶寶數數,每天有空就抱著孩子數「1、2、3……」,寶寶也每天跟著媽媽數「1、2、3」。
  • 三維遊戲OUT了 國外開發商或將推出神奇四維空間遊戲
    近日,國外一位富有創意的獨立遊戲開發者計劃製作一款四維的遊戲,那麼究竟怎麼實現四維空間呢?  獨立遊戲開發者馬克·騰·博世(Marc ten Bosch)正在籌備一款燒腦的4D冒險解謎遊戲Miegakure,玩家必須在第四維中穿過牆壁才能勝利。如今他推出了一個講解視頻清晰地解釋了遊戲複雜的物理世界,拯救了原來望而生畏的玩家們。
  • 教娃念「123」不科學?陪孩子「玩」數字,才是真正的數學啟蒙
    也就是說,教孩子數123的數學啟蒙方法,並不科學。為什麼教孩子數「123」不科學?提到數學啟蒙,不得不提「數感」一詞。數感指的是,孩子能理解數字是一種計數工具,並用多種方式來表示數字。也可以在實際生活中,讓孩子用數字表示次序,比如第一個人、第二個人等等。3、數學與遊戲結合數學學習是非常容易感到枯燥的,為了激發孩子的數學學習興趣,在數學啟蒙時,完全可以將數學知識融入到遊戲中。而且,孩子6歲前認知世界的主要方式就是遊戲,這樣的學習方式對孩子來說更容易。
  • 3D遊戲編程:遊戲代碼的整體結構是什麼樣子的?
    為了能讓作為初學者的你學明白3D遊戲編程,我花費了17節的內容來講了一些「廢話」,只是希望你不要忽略這些「廢話」。3D遊戲編程實在是太複雜了,如果可以的話,我還想說一些更深層次的內容。但是我不能這麼做,過深的東西講得太多了,很容易「勸退」的。
  • 高中數學平面向量必考知識與題型解法大全,帶你輕鬆學向量!
    高考的時候平面向量這方面的知識是考試的重點也是難點,每年都會以各種形式出現,而這一部分的知識很多同學說學不明白,學姐來安利這一部分啦!適當的空間直角坐標系,利用向量的坐標運算證明線線、線面、面面的平行與垂直,以及空間角(線線角、線面角、面面角)與距離的求解問題,是高考的考查熱點,以解答題為主,多屬中檔題。在高考備考中精心準備,加強系統化、專業化訓練完全能夠成為學生的得分點!
  • 計算思維≠編程,該如何培養孩子的計算思維?
    想要理解抽象和自動化之於計算思維的重要性,我們先來看下運用計算思維進行問題求解的關鍵路徑:(1)把實際問題抽象為數學問題,並建模,即將人對問題的理解用數學語言描述出來(2)進行映射,把數學模型中的變量等用特定的符號代替,即用符號一一對應數學模型中的變量和規則等(3)通過編程把解決問題的邏輯分析過程寫成算法
  • Github霸榜:從零開始學3D著色器編程
    主要介紹了通過使用Panda3D遊戲引擎和OpenGL著色語言來為3D遊戲添加紋理,法線貼圖,泛光,環境遮擋等等。教程內容十分豐富,動圖也非常生動。Shader,是運行在GPU上的程序,中文稱為著色器。它的主要用途是對三維物體進行著色處理,對光與影進行計算,以及控制紋理顏色的呈現等,最終,將遊戲引擎中的幾何數據轉化為屏幕上的模型、場景以及特效。
  • 數學啟蒙就是教孩子加減法嗎?打好數學基礎,要靠這4個方法
    如果孩子不理解數學本身的邏輯,沒有形成數學思維,那麼僅僅會數數、會加減法是遠遠不夠的。打好數學基礎,要靠這4個方法一、有趣的數學遊戲對於學齡前的孩子來說,學習和遊戲是一件事,也就是說只有讓孩子感受到有趣、好玩他才會願意玩、願意學。
  • 教孩子寫遊戲:手寫一個最最簡單的Windows程序框架
    你不用把這個集成工作環境想像地那麼難,覺得編程很高大上,然後覺得這個軟體也很高大上。如果這樣想的話,你就很難教好孩子了。編程的高難度時代已經過去,各種各樣的底層技術難題已經被我們的前輩們解決,而且很好地封裝到了各種各樣的函數中,我們只要懂得如何去使用就可以了。這一節課,我們就用這個集成工作環境寫一個Windows程序的框架。
  • 博主營地 | Unity3D 實用技巧 - 理論知識庫(一)
    發稿入口:unity.cn/articles  更多Unity博主專屬權益見文末  其實學習Unity3D引擎,我們除了懂得實操,同時兼顧理解一些理論知識,也是挺不錯的積累。今天小編會把常用的一些理論問題匯總起來,後面可以做一個快速的記憶和學習。  請簡述值類型與引用類型的區別。
  • 是遊戲,還是課程?一文讀懂少兒編程品牌CodeMonkey
    進入中國後,CodeMonkey根據中國孩子的成長特點進行了本土化改造,讓中國的孩子在少兒編程教育上與世界同步。  CodeMonkey雖然是一款在線編程教育工具,但更像是一款闖關模式的遊戲。  在遊戲中,每過一關就可以學習一個知識點,讓孩子在不知不覺中提升編程能力,同時獲得成就感。除了編程知識,在CodeMonkey的學習中,孩子還能學到數學和英語。例如用尺子量小猴需要走幾步,使用「step」指令就是前進的意思。
  • 還在頭疼教孩子認識數字1-10嗎?這3個數學小遊戲輕鬆解決!
    其實,生活中數學無處不在,而教孩子數數的方法也各式各樣。尤其是學齡前的孩子,家長一定要善於利用生活場景,把抽象、枯燥的數學變成有趣的遊戲,培養他們對數學的興趣和敏感度。
  • 如何製造一個簡單的2D遊戲?
    除此之外,一些相對輕量的3D遊戲也可以考慮使用Unity開發,比如Monument Valley(紀念碑谷)、The ROOM(謎室)、Outer Wilds(星際拓荒)、The Almost Gone(憶落謎境)、Kerbal Space Program(坎巴拉太空計劃)等等。(上面舉例的遊戲都很好玩XD!感興趣可以玩玩看。(明日方舟也是用Unity開發的!(嘗試抓人入教.
  • 人工智慧入門必須攻克三道門檻:數學基礎、英語水平與編程技術
    數學基礎知識蘊含著處理智能問題的基本思想與方法,也是理解複雜算法的必備要素。今天的種種人工智慧技術歸根到底都建立在數學模型之上,要了解人工智慧,首先要掌握必備的數學基礎知識,具體來說包括:1、線性代數:如何將研究對象形式化?
  • 數據科學中的數學基礎: 矩陣和向量空間
    首先通過一個簡單例子來感性認識一下標量(scalar)、向量(vector)和矩陣(matrix)這 3 個數學概念。假設我們設計了一款網絡對戰遊戲,在遊戲中,玩家選擇自己的英雄與其他玩家對戰。每個英雄的能力由 3 種屬性描述:智力、敏捷和力量。為了方便表示,不妨用 i 表示智力、a 表示敏捷、s 表示力量。