• 您的位置:首頁 > 新聞動態 > Unity3D

    Unity3d Rigidbody 碰撞(zhuàng)穿透

    2018/4/25      點擊:

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

    物理的碰撞當然是基(jī)於物理檢測計(jì)算,而這個計算是(shì)消耗(hào)cpu和gpu的,那麽,碰撞穿透是什麽鬼?

    發生概率即觸發方式:

    1.剛體速度(dù)足夠快,被撞物體的collider足(zú)夠(gòu)薄。

    2.剛體速度在一定的v,被撞物體也在(zài)一定(dìng)的速度(dù)v(被撞物體可移動(dòng))。

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

    在分析這兩(liǎng)種(3種)情況之前,先(xiān)了解下一個剛(gāng)體(rigidbody)屬性參數:Collision Detection(碰撞檢測):

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

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

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

    這就很好理解,如果我們的主角在運動中碰到的都是(shì)靜態collider,那麽使用(yòng)離散(sàn)檢測是可(kě)以滿(mǎn)足的(de)。如果我們在遊戲中,主角將會碰撞到動態的collider,那麽檢測模式應(yīng)該(gāi)選擇連續或者連續動態檢測。這樣可以很好的避免穿透現象。

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

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


    密桃直播-密桃直播手机版下载-蜜桃直播app下载安装-蜜桃直播官方版下载