UE4.21前的版本采用的是NVIDIA的PhysX做為其默認的物理引擎,用於計算3D世界的碰撞查詢與物理模擬。自4.21版本開始改物理調用接口,但這並不是閑來重構代碼,果然在2019GDC大會上放出了正在自建Chaos物理系統的消息,從4.22預覽版中已經可以看到相關代碼,官方預計4.23就可以開始使用,還是值得期待的。
最近打算重點研究下物理系統,知乎上已經有相當不錯的研究報告了,強烈推薦看的是:
Jerish:《Exploring in UE4》物理模塊淺析[原理分析]
作者自己是花了很多功夫研讀代碼寫成的,雖是淺析也非常詳細。
此外還有:
以及代碼貼得比較多的:
也都值得看看。
我自己再寫這塊地方,自然會做到與幾位前輩有區分度,也希望大家讀后會有不同的體會。還是以問答的方式來闡述,會比較清晰些。
1. 什么是游戲中的物理系統?
游戲物理主要是解決兩個問題,其一是碰撞查詢(Query),比如我面前有一堵牆,我還可以走多遠就會被撞到;其二是物理模擬(Simulation),比如游戲角度死亡后身體該如何倒下,飛馳的載具被路上的矮石墩碰到后如何表現等。
2. UE4是如何建立物理系統的?
目前版本還是依賴於第三方的PhysX,UE4自身提供PrimitiveComponent,擁有BodyInstance,上面記錄了PhysX所需要的物理數據,會將這些信息傳遞給PhysX所創建的物理世界,然后由PhyX進行處理,並得到其返回的結果。
那么既然物理的結果涉及到UE4和三方PhysX,那出了問題該怎么查,自然就有如下問題了。
3. 如何Debug物理系統?
對於UE4,可以在跑起的游戲中按`(鍵盤左上角ESC的正下方)呼出控制台,然后單擊show collision(會自動聯想,差不多的時候按TAB鍵就補全了),如下圖:
回車后就可以看到世界里面多了線條型的盒子,如下圖:
這就是UE4里面提供給PhysX處理前的碰撞信息,我們稱之為碰撞盒,它大致包住了物體模型。碰撞盒可以做的很簡單(如上圖用物體輪廓包圍盒),也可以做的很復雜(如直接用物體模型本身三角面片),這個下一章就說。
對於PhyX,它對於UE4來說就是一個提供輸入然后獲取輸出的黑盒,不過可以通過NVIDIA提供的PhysX Visual Debugger(PVD)來進行可視化調試,下載地址如下:
需要注冊賬戶才可以下載,安裝成功后會看到軟件的圖標如下:
運行界面如下:
什么也沒有,別急,我們在編輯器里跑起游戲,呼出控制台,然后輸入pvd connect,如下:
過一會兒就可以按ESC停掉游戲,這時回到PVD軟件窗口,就可以看到軟件里面有東西顯示出來了,是一個巨大的黃球,如下:
在右側Setting欄里面把Sleeping objects給關掉,如下:
這樣就可以看到與游戲內場景樣子差不多的物理世界了,如下:
可以看到兩個椅子,還有一個桌子,桌子上放着一個雕塑模型,這與之前在UE4里面按show collision得到的結果是一致的,是較為粗糙的輪廓包圍盒,至於靠右的圓柱,那是玩家的出生點,因為有碰撞所以也會被物理世界采集到。
每一個物理對象在PhyX里面都對應一個PxRigid,如果這個對象是靜態的,則是PxRigidStatic,在PVD里面繪制成紅色;如果這個對象是動態的,則是PxRigidDynamic,在PVD里面繪制成黃色的。這里所有非休眠對象都是靜態的,所以上圖看上去都是紅色的。可以選中其中的一個模型,比如左側的椅子,可以看到左側面板上列出了它對應的那個PxRigidStatic,id是163,如下:
展開這個PxRigidStatic,發現它有兩個PxShape,展開Geometry,可以看到分別是凸包模型(ConvexMesh)與三角形模型(TriangleMesh),如下:
這實際上對應於這個椅子的兩個碰撞盒,一個是簡單碰撞盒凸包,一個是復雜碰撞盒模型自身三角形, 這個會在下一章節介紹。PVD軟件頂上還有一個顯示幀數的拖拉條,如下:
右側數字說明在物理世界里面總共有218幀,可以拖動顯示前幾幀內物理世界的變化,這個在分析動態物理對象時非常有用,但本示例都是靜態物理對象,所以沒啥變化。
這個PVD工具非常好用(雖然會常常崩潰),在以后的章節中會經常用到,這里只要知道用pvd connect命令進行物理世界可視化即可,了解下物體的碰撞盒。那么問題來了:
4. 物體的碰撞盒是如何建立的呢?
詳見:
5. 兩個物體靠近會發生什么呢?
詳見: