• 您的位置:首頁 > 新聞動態(tài) > Unity3D

    Unity3d Rigidbody 碰撞穿透

    2018/4/25??????點擊:

    首先,說說碰撞的條件:1.rigidbody(剛體),一般用在主動移動的物體上,比如角色。2.collider,碰撞器,一般用于受力物體上,比如障礙塊。

    物理的碰撞當(dāng)然是基于物理檢測計算,而這個計算是消耗cpu和gpu的,那么,碰撞穿透是什么鬼?

    發(fā)生概率即觸發(fā)方式:

    1.剛體速度足夠快,被撞物體的collider足夠薄。

    2.剛體速度在一定的v,被撞物體也在一定的速度v(被撞物體可移動)。

    3.暫時未發(fā)現(xiàn)的其他情況。

    在分析這兩種(3種)情況之前,先了解下一個剛體(rigidbody)屬性參數(shù):Collision Detection(碰撞檢測):

    它有三種選項:Discrete(離散),Continuous(連續(xù)),Continuous Dynamic(動態(tài)連續(xù)),我們參考下官方的解釋:

    該屬性用于控制避免高速運(yùn)動的游戲?qū)ο蟠┻^其他的對象而未發(fā)生碰撞,有三項可供選擇
    Discrete:離散碰撞器。該模式與場景中其他的所有碰撞體進(jìn)行碰撞檢測。該項為默認(rèn)值。
    Continuous:連續(xù)碰撞檢測。該模式用于檢測與動態(tài)碰撞體(帶有Rididbody)的碰撞,使用連續(xù)碰撞檢測模式來檢測與網(wǎng)格碰撞體(不帶ridigbody)碰撞。(添加一句原文翻譯漏了),Rigidbody設(shè)置為連續(xù)動態(tài)碰撞檢測模式將使用連續(xù)碰撞來檢測。其他剛體會采用離散碰撞模式。此模式適用于那些需要與采用連續(xù)動態(tài)檢測的對象相碰撞的對象。這對物理性能會有很大影響,如果不需要對快速運(yùn)動對象進(jìn)行碰撞檢測,就使用離散碰撞檢測模式。
    Continuous Dynamic:連續(xù)動態(tài)碰撞檢測模式,該模式用于檢測與采用連續(xù)碰撞撞模式或連續(xù)
    動態(tài)碰撞模式對象的碰撞,也可用于檢測沒有rigidbody的靜態(tài)網(wǎng)格碰撞體。對于與之碰撞的其他對象可采用離散碰撞檢測。動態(tài)連續(xù)碰撞檢測模式也可用于檢測快速運(yùn)動的游戲物體。
    翻譯就是這樣的理解并不難:后面兩項就是為了用來能夠檢測到快速運(yùn)動的物體不至于
    你的void OnCollisionEnter(Collision hit)函數(shù)檢測不到,而至于一個為Continuous Dynamic的剛體和一個Discrete的剛體碰撞,前者會使用使用Continous(連續(xù))碰撞,后
    者離散碰撞

    再來總結(jié)下:當(dāng)使用默認(rèn)的離散式碰撞檢測時,如果前一楨時對象在墻這一面,下一楨時對象已到到了墻另一面,那么碰撞檢測算法將檢測不到碰撞的發(fā)生,你可以將該對象的碰撞檢測屬性設(shè)置為Continuous,這時碰撞檢測算法將會防止對象穿過所有的靜態(tài)碰撞體,設(shè)置為Continuous Dynamic將還會防止穿過其他也設(shè)置為Continuous或者Continuous Dynamic的剛體。

    這就很好理解,如果我們的主角在運(yùn)動中碰到的都是靜態(tài)collider,那么使用離散檢測是可以滿足的。如果我們在游戲中,主角將會碰撞到動態(tài)的collider,那么檢測模式應(yīng)該選擇連續(xù)或者連續(xù)動態(tài)檢測。這樣可以很好的避免穿透現(xiàn)象。

    然后,你以為這樣就高枕勿憂了么?在實際的項目中,我們可能會發(fā)現(xiàn),我們剛體上已經(jīng)選擇了連續(xù)檢測甚至連續(xù)動態(tài)檢測,依舊會有穿透問題,這就是我上面列舉的兩條(3條),被碰撞體的碰撞器太薄,被碰撞體的速度太快。這樣依舊會導(dǎo)致穿透,那么原理是什么?我們知道unity中有fixedupdate,update這些更新方法,而這些更新中,都是有時間間隔更新的,更新的時候是用基礎(chǔ)速度*時間,很有可能這個結(jié)果計算出來的時候車已經(jīng)沖過了被碰撞體,就導(dǎo)致了我們的角色穿透,或者卡在被碰撞器的里面。

    so,知道了這些,我們在項目中就知道如何規(guī)避這些“bug”了