從零開始手敲次世代遊戲引擎(三十八)

接從零開始手敲次世代遊戲引擎(三十七),本篇我們來進行物理引擎的一些基本探討。

最後執行的效果如下:

https://www.zhihu.com/video/938430940633128960

場景的創建

首先我們使用Blender來創建一個測試用的場景。這個場景很簡單,由一個平面和兩個球體組成。布置好之後,可以切換到攝像機視角看一下位置:

https://www.zhihu.com/video/938173929878192128

接下來我們用GIMP創建地板的貼圖。創建一個空白的512x512的圖像,然後用濾鏡加入彩色的噪點,再用一個馬賽克濾鏡將其轉化成為彩色蜂窩狀的馬賽克拼接就可以了。將其保存為TGA圖片,放到貼圖目錄當中。

https://www.zhihu.com/video/938176767110889472

然後我們再回到Blender當中,為平面指定這個圖片作為貼圖。注意如果貼圖出現錯位現象,需要修一下UV。

https://www.zhihu.com/video/938180499097739264

好了,將場景導出為OGEX文件,然後用文本編輯器修改一下OGEX當中的貼圖路徑。(因為導出的路徑為絕對路徑,而我們的引擎需要相對路徑)

導入物理模擬庫

在遊戲當中有兩類常用的物理計算:

  1. 碰撞
  2. 運動學(力學)

在詳細討論這些之前,我們先導入一個在業界比較有名的,也是比較成熟的庫來建立一些感性認識。

參考引用*1是一個名為Bullet的物理模擬庫,是由原SIEA(索尼互動娛樂美國)的員工寫的並作為開放源碼項目在GitHub上面提供。因為它也是採用了CMake的編譯系統,所以我們可以很容易地將其導入到我們項目當中。具體細節這裡就不贅述了,感興趣的可以直接看本章對應的源碼當中build_bullet腳本。

編寫PhysicsManager

為了管理物理模擬,我們在我們的引擎代碼的Framework/Common下面新建PhysicsManager的源代碼,將Bullet的初始化/銷毀以及創建物理模擬用場景的代碼進行包裝。

在PhysicsManager的Tick事件處理代碼當中,我們從之前寫的SceneManager那裡獲取需要渲染的場景結構,對於其中的每個SceneNode進行檢測,看看是否需要進行物理模擬:如果需要,我們使用Bullet創建一個剛體模型(含碰撞盒),將其綁定到對應的SceneNode上面,並將其加入到物理模擬場景(DynamicsWorld)當中去。然後我們通過調用DynamicsWorld的stepSimulation,計算下一個1/60秒的模擬結果。

模擬結果的反映

在渲染時,我們同樣從SceneManager獲取所需要渲染的場景結構,遍歷所需要渲染的SceneNode並檢測其是否綁定了剛體模型。如果綁定了剛體模型,則我們使用存儲在剛體模型當中的最新模擬結果更新SceneNode的Transform(也就是空間位置與姿態)。這樣我們模擬的結果就會在渲染的結果當中反映出來了。

其它

因為Blender當中也集成有Bullet,本來我是想直接在Blender當中綁定物理模型並直接導出的,但是目前最新的OGEX(2.0)似乎還不支持物理模型的導出。所以我就自己利用OGEX的Extension自定義結構對OGEX進行了一點兒簡單的擴展,使其可以支持物理模型。

不過我目前還沒有對Blender的OGEX導出腳本進行修改,因為我還不了解Blender的Python介面。所以寫這篇文章的時候我是通過文本編輯器直接編輯OGEX文件(Asset/Scene/physics_1.ogex)加入了這些擴展屬性。

如之前文章下面有讀者評論的,業界其實用得比較多的場景導出格式是COLLADA。之後等我們支持了COLLADA之後,這些問題也自然解決了。所以目前我不準備在這方面花太多精力。

另外,因為這個場景很簡單,整個模擬很快就結束了,不太容易觀察,所以我修改了前一篇所寫的InputManager,加入了「按下R鍵重置場景」的功能。也就是說,按下鍵盤上的R鍵就可以重新載入場景進行模擬。

最後完成的代碼在:

netwarm007/GameEngineFromScratchgithub.com圖標

參考引用

Real-Time Physics Simulationbulletphysics.org圖標https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotationen.wikipedia.org圖標Quaternions and spatial rotationen.wikipedia.org圖標Build a simple 2D physics engine for JavaScript gameswww.ibm.com圖標3D Theory - animation using physics - Martin Bakerwww.euclideanspace.com圖標Integration Basicsgafferongames.com圖標
推薦閱讀:

為什麼市面上沒有出現玩法類似《精靈寶可夢》遊戲?
用國外的3d遊戲開源引擎製作遊戲,是否可以說這款遊戲是自己寫的?
觸樂Live專題上線:和三名熱愛遊戲的玩家一起打破「遊戲無用論」
我的Live《北美遊戲業入行門道和從業體驗》附加分享信息
cocos2dx中可以用 stl么?

TAG:游戏开发 | 编程 | 仿真 |