UE4物理模塊(一)---概述與可視化調試


UE4.21前的版本采用的是NVIDIA的PhysX做為其默認的物理引擎,用於計算3D世界的碰撞查詢與物理模擬。自4.21版本開始改物理調用接口,但這並不是閑來重構代碼,果然在2019GDC大會上放出了正在自建Chaos物理系統的消息,從4.22預覽版中已經可以看到相關代碼,官方預計4.23就可以開始使用,還是值得期待的。

最近打算重點研究下物理系統,知乎上已經有相當不錯的研究報告了,強烈推薦看的是:

Jerish:《Exploring in UE4》物理模塊淺析[原理分析]​zhuanlan.zhihu.com圖標

作者自己是花了很多功夫研讀代碼寫成的,雖是淺析也非常詳細。

此外還有:

祖年:UE4物理介紹​zhuanlan.zhihu.com圖標

以及代碼貼得比較多的:

UE4物理引擎模塊分析​www.jianshu.com圖標

也都值得看看。

我自己再寫這塊地方,自然會做到與幾位前輩有區分度,也希望大家讀后會有不同的體會。還是以問答的方式來闡述,會比較清晰些。

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)來進行可視化調試,下載地址如下:

PhysX Visual Debugger​developer.nvidia.com圖標

需要注冊賬戶才可以下載,安裝成功后會看到軟件的圖標如下:

運行界面如下:

什么也沒有,別急,我們在編輯器里跑起游戲,呼出控制台,然后輸入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. 物體的碰撞盒是如何建立的呢?

詳見:

Jerry:UE4物理模塊(二)---建立物體碰撞​zhuanlan.zhihu.com圖標

5. 兩個物體靠近會發生什么呢?

詳見:

Jerry:UE4物理模塊(三)---碰撞查詢​zhuanlan.zhihu.com圖標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM