UE4碰撞規則詳解


UE4的碰撞設置在官方的文檔的 物理模擬模塊(鏈接:點擊打開鏈接)。但是操作起來感覺坑還是比較多,所以這里總結一下,以防平時經常會漏掉或忽略某些條件。如果想看關於碰撞響應觸發,可以參考鏈接( UE4藍圖碰撞檢測解析) 如果想進一步深入UE物理引擎相關內容,請參考博客 (UE4物理模塊分析

 

 

現在開始講解並總結一下UE4里面的碰撞規則:

 

1.只有擁有Collision屬性的實體才可以碰撞

每個實體Actor,包括static Mesh,sphere,capsule等帶碰撞的組件,在detail細節面板都有一個collision屬性的欄。這個里面的參數是控制這些實體間進行碰撞的必要條件。

(注:在UE4里面,所有可以直接放在UE4場景世界里的對象都是一個Actor,這個類型在C++中是類AActor。其本身包含了非常多的屬性,如坐標,碰撞等必要的特性。繼承於Actor的有Pawn,Character,StaticMeshActor,CameraActor等等,所以在游戲世界存在的實體都屬於Actor,不過Actor本身可能還包含組件等更多其他的元素)

 

2.不同實體的碰撞通過碰撞通道來區分

在UE4世界里面所有帶碰撞的Actor被分為很多類別,比如WorldDynamic,Worldstatic,Pawn,character等,這些類型被稱為一個個collision channel(碰撞對象通道)。一般來說,系統幫你設置了一些基本的collision channel。比如一個設置為靜止的立方體歸屬於Worldstatic,而一個設置為可以動的球體歸屬於WorldDynamic。UE4做的非常的靈活的是,這個通道的類型,你可以任意的設置與添加,這樣,你就可以根據你的情況自由的設置恰當的通道。更自由的是,你可以隨時改變這個實體對象所屬於的通道類型。

 

3.每一個實體必定有其自身屬於的通道類型

每一個帶有碰撞的Actor都有一個自己屬於的通道類型,這個類型就在下圖的Object Type里面。

 

4.每個實體可以通過碰撞預設來設置是否對其他通道類型實體產生碰撞

每一個帶有碰撞的Actor都有一個Collision Presets(我們稱他為碰撞預設),這個預設里面記錄了他與系統設置里面所有通道類型之間的碰撞關系。參考下圖,我們可以看到,這個實體本身的通道類型是WorldStatic,碰撞預設為BlockAll,意思就是與所有的實體都會產生碰撞。我們可以看到在下面有一個列表叫Collision Response,下面所有的對號都打在了Block里面,這就表示這個實體本身與所有打鈎的對象都會產生碰撞。(你會看到還有一個trace response,之后再介紹)除了Block,還有Overlap和Ignore,分別是重疊和忽略。

 

5.碰撞時相互的,所以兩個相互碰撞的實體設置都要滿足碰撞條件

那是不是下圖的這個實體就會和所有實體都會產生碰撞?不是的!我們知道力的作用是相互的,那這里的這個預設也是一個道理,另一個物體想與該實體碰撞,必須在這個物體所屬的類型里面的Block打上對號才可以。這樣二者就會相互碰撞了。

 

6.重疊事件也很重要,可以作為場景觸發器事件

設置為Ignore和Overlap就不會產生任何碰撞,但是overlap會產生overlap事件(藍圖以及代碼中可以判斷實體之間是否有重疊,下面有簡單解釋)

 

7.trace response的理解

除了碰撞的通道,還有trace通道。trace也是一種碰撞檢測的方法,向一個方向位置發射一個射線,對射線擊中的對象進行判斷,進而采取進一步措施。

所以trace response就是設置實體本身發射的trace會不會被其他對象響應。

 

8.正確設置staticMesh的碰撞盒類型(這是導致很多奇怪問題的重要bug)

每個staticMesh的碰撞盒必須正確對應他的StaticMeshSettings下的CollisionComplexity屬性(雙擊靜態網格物體文件即可進入編輯器)。這里簡單介紹一下,每個靜態網格實體都可以在編輯器里面添加碰撞盒,可以給物體設置簡單的碰撞盒(球型,盒型,10個面的碰撞盒等),也可以設置復雜的碰撞盒。如果你給該靜態物體設置簡單的碰撞盒,StaticMeshSettings下的CollisionComplexity屬性就應該設置為UseSimpleCollisionAsComplexity。如果設置了復雜的碰撞盒(AutoConvexCollision),這個屬性就該為UseComplexityCollisionAsSimple(設置為Default也可以)。如果設置反了,就很容易出現無法正確模擬物理碰撞的情況。

 

9.最后,我們看一下圖中的Collision Enabled類型。

正常4.8之前的版本有下面三個類型選項,文檔基本說的比較通俗,不過有兩點要注意

No Collision(無碰撞) - 不同該對象發生碰撞,無論是蹤跡碰撞還是物理碰撞。
No Physics Collision(無物理碰撞) - 該剛體僅用於射線投射、掃射及重疊。
Collision Enabled(啟用碰撞) - 該剛體用於物理模擬和碰撞查詢。

   a.這個選項類似一個總開關,如果這個地方選擇了No Collision,那么不管前面怎么設置通道,也不會產生任何碰撞事件

 

   b.這個里面No Physics Collision表示不進行物理模擬,就是說在這個實體移動時不會產生任何碰撞,但是各種重疊的事件還是會觸發的。當這個實體靜止的時候,與Collision Enabled的效果是完全一樣的,可以碰撞也可以觸發各種事件。

 

4.9之后變為下面的四個類型,如果你在官方文檔找不到,切換成英文再查一下就能看到了。(中文文檔總是更新的比較慢)

No Collision No collision is enabled for this body.
Query Only This body is used only for collision queries (raycasts, sweeps, and overlaps).
Physics Only This body is used only for physics collision.
Collision Enabled This body interacts with all collision (Query and Physics).

其實4.9之后把原來的No Physics Collision分成了Query Only 和 Physics Only,也就是說Query Only可以進行各種trace,sweep,Overlap事件的觸發,但是不會進行物理模擬,簡單的講就是運動時不會產生任何碰撞。但是靜止時是由碰撞的。

Physics Only表示只能進行物理碰撞與運動模擬,但是不會觸發任何事件。

注意:如果這里設置為No Collision,那么即使在Actor對象開啟了simulatePhysics(開啟物理模擬)也不會有效,也就不會受到重力而下落

 

其他注意內容:對於每個StaticMesh類型的Actor(即存在於場景中的實體),他的的detail面板下StaticMesh欄下有一個BlockingVolum,功能是創建一個物理體積。所謂物理體積就是一個游戲不可見的但是真實存在的實體,可以用於觸發事件等。BlockingVolum就是一個帶碰撞盒的體積,點擊這個按鈕,就是給這個實體創建一個單獨的碰撞盒體積。按住Alt+C可以隱藏或者顯示碰撞盒。這個體積可以用於場景中用畫刷刷出來沒有碰撞盒的靜態物體,但是也需要碰撞的物體。

原文鏈接(轉載請標明):http://blog.csdn.net/u012999985/article/details/51290096


免責聲明!

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



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