• Unity3d Rigidbody 碰撞穿透

    2018/4/25      點擊:

    首先,說說碰撞的條件:1.rigidbody(剛體(tǐ)),一般用在(zài)主動移動的物體上,比如角色(sè)。2.collider,碰撞(zhuàng)器,一般用於受力物體上,比如障(zhàng)礙塊。

    物理的碰撞當然是基於物(wù)理(lǐ)檢測計算,而這個計算是消耗cpu和gpu的,那麽,碰撞穿透是什麽鬼(guǐ)?

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

    1.剛(gāng)體速度足夠快,被撞物體(tǐ)的(de)collider足夠薄。

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

    3.暫時未發現的其他情況。

    在分析這兩種(3種)情(qíng)況之前,先了解下一個剛體(rigidbody)屬性參數:Collision Detection(碰撞(zhuàng)檢測(cè)):

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

    該屬性(xìng)用於控製避免高速運動的遊戲(xì)對象穿過其(qí)他的對象而未發生碰撞,有三項可供選擇
    Discrete:離散碰撞器(qì)。該模式與場景中其他的所有碰撞體進行(háng)碰撞檢測(cè)。該項為默認值。
    Continuous:連續碰撞檢測。該模式用於檢測與動態碰撞體(帶有Rididbody)的碰撞,使用連續碰撞檢測模式來檢(jiǎn)測與網格碰撞(zhuàng)體(不帶(dài)ridigbody)碰撞。(添加一句原文(wén)翻譯漏了),Rigidbody設置為連(lián)續動態碰撞(zhuàng)檢測模式將使(shǐ)用(yòng)連續碰撞(zhuàng)來檢測。其他剛體會采用離散碰撞模式。此模式適用於那些需(xū)要與采用連續動態檢測的對象相碰撞的對象。這對(duì)物理性能會(huì)有(yǒu)很大影響,如果不需要(yào)對快速運動對(duì)象(xiàng)進行碰撞檢測,就(jiù)使用離散(sàn)碰撞檢測模式。
    Continuous Dynamic:連續(xù)動態碰(pèng)撞檢測模式,該模式(shì)用於檢測與采用連續碰撞撞模式或連續
    動態碰撞模式對象的碰撞,也(yě)可用於檢測沒有rigidbody的(de)靜態網格碰(pèng)撞體。對於與之碰撞的其他對象可采(cǎi)用離散(sàn)碰撞檢測。動態連續碰撞檢測模式也可用於檢測快速運動的遊戲物體。
    翻譯就(jiù)是這樣的理解並不難:後麵兩項就是為了(le)用來能夠檢測(cè)到快速運動的物體(tǐ)不至於
    你的(de)void OnCollisionEnter(Collision hit)函數檢測不到,而至於一個為(wéi)Continuous Dynamic的剛體和(hé)一(yī)個Discrete的剛體碰撞,前者會使用使用Continous(連續)碰撞,後
    者離(lí)散碰撞

    再來總結下:當使(shǐ)用默認的離(lí)散式碰撞檢測時,如果前一楨時對象(xiàng)在牆(qiáng)這一(yī)麵,下一楨時對象已到到了牆另一麵,那麽碰撞檢測算法將(jiāng)檢測不到碰撞的發生,你可以將該對象的碰撞檢測(cè)屬性設置為Continuous,這時碰撞檢(jiǎn)測算法將會防止對象穿過所有的靜態碰撞體,設置為(wéi)Continuous Dynamic將還會防(fáng)止穿過其他也設置為Continuous或(huò)者Continuous Dynamic的剛體。

    這就很(hěn)好理解,如果我(wǒ)們的主角在運動中碰到的都(dōu)是靜態(tài)collider,那麽使用離散檢測是可以滿足的。如果我們在遊戲中,主角將(jiāng)會碰(pèng)撞到動態的collider,那麽檢測模式應該選擇連續或者連續(xù)動態檢測。這樣可以很好的避免穿透(tòu)現象。

    然後,你以為這樣就高枕(zhěn)勿憂了麽?在(zài)實際(jì)的項目中,我們可能會發現,我們剛(gāng)體上已經選擇了連續檢測甚至連續動態檢(jiǎn)測,依舊會有穿透問題,這就是我上麵列(liè)舉的兩條(3條(tiáo)),被碰撞體的碰撞器太薄,被碰撞體(tǐ)的速度太快。這(zhè)樣依舊會導致穿透(tòu),那麽原理是什麽?我們知道unity中有(yǒu)fixedupdate,update這些更新方法,而這些更新(xīn)中,都是有時間間隔更新的,更新的時候是用基礎速度*時(shí)間,很有可能這個結果計算出來的時候車已經衝過了被碰撞體,就導致了我們的(de)角色穿(chuān)透,或者卡在被碰撞器的裏麵。

    so,知道了(le)這些,我們(men)在項目中就知道(dào)如何(hé)規避這些“bug”了


    91网站入口_91视频导航_91短视频在线_91视频在线免费观看