Unity3d Rigidbody 碰撞(zhuàng)穿透(tòu)
首先,說說(shuō)碰撞的條件:1.rigidbody(剛體),一般用在主(zhǔ)動移動的物體上,比(bǐ)如角(jiǎo)色。2.collider,碰(pèng)撞器,一般用於受力物體上,比如障礙塊。
物理的碰撞當然是基於物理檢測計算,而這個計算是消耗cpu和gpu的,那麽,碰撞穿透是什麽鬼?
發生概率即觸發方式:
1.剛體速度足(zú)夠快,被撞物體的collider足夠薄。
2.剛體速度在一定的v,被撞物體也(yě)在一定的速度v(被撞物體可移(yí)動)。
3.暫時未發現的其他情況。
在分析這兩種(3種)情況之前,先(xiān)了解下一個剛體(rigidbody)屬性參數:Collision Detection(碰撞檢測):
它有三種選項:Discrete(離散),Continuous(連續),Continuous Dynamic(動態連(lián)續),我們參考下官方的解釋:
該屬性(xìng)用於控製避免高速運動的遊戲對(duì)象穿過其他的對象而未(wèi)發生碰撞,有三項可供選擇
Discrete:離散碰撞器。該模式與場景中其他的所有碰撞體進行碰撞檢測。該(gāi)項為默認值。
Continuous:連續碰撞(zhuàng)檢測。該模式用於(yú)檢測與動態碰撞體(帶有Rididbody)的碰撞,使用連續碰撞檢測模(mó)式來(lái)檢測與網格碰撞體(不(bú)帶(dài)ridigbody)碰撞。(添加一(yī)句原文翻(fān)譯漏了),Rigidbody設置為連續動態碰撞檢測模式(shì)將使用連續碰撞來檢測。其他剛體會采用離散碰撞模式(shì)。此模式適用於那些需要與采用連續動態檢測的對象相碰撞的對象。這對(duì)物理性能會有很大影響(xiǎng),如果不需要對快速運動對象進行碰撞檢測,就使用離散碰撞檢測模式(shì)。
Continuous Dynamic:連續動態碰撞檢測模式,該模式用於檢測與采(cǎi)用連續碰撞撞模式或連續
動態碰撞模式對象的碰撞(zhuàng),也(yě)可用於檢測沒有rigidbody的靜態網(wǎng)格碰撞體。對於與之碰(pèng)撞的其他(tā)對象可采用離散碰撞檢測。動態連續碰撞檢(jiǎn)測模式也可用於檢測快速運動的(de)遊戲物體。
翻譯就是這樣的理解並不(bú)難:後(hòu)麵兩項就是為(wéi)了用來(lái)能夠檢測到快速運動(dòng)的物體不至於
你的void OnCollisionEnter(Collision hit)函數檢測不到,而至於一個為Continuous Dynamic的(de)剛體和一個Discrete的剛體碰撞,前者會使用使用Continous(連(lián)續)碰撞,後
者離散碰撞
再來總結下:當(dāng)使用默認的離散式碰撞(zhuàng)檢(jiǎn)測時,如果前一楨時對象在牆這一麵(miàn),下一楨時對(duì)象已到到了牆(qiáng)另一麵,那麽碰撞檢(jiǎn)測算法將檢測不到碰撞的發生,你可以將該對象的碰撞檢(jiǎn)測屬性設置(zhì)為Continuous,這時碰撞檢測算法(fǎ)將會(huì)防止(zhǐ)對象穿過所有的靜(jìng)態碰撞體,設置為Continuous Dynamic將還會防(fáng)止穿(chuān)過其他也設置為Continuous或(huò)者Continuous Dynamic的(de)剛體。
這就很好理解,如果我們的主角在(zài)運動中碰到的都是靜(jìng)態collider,那(nà)麽使用離散檢測是可以滿足的。如果我們在遊戲中(zhōng),主角將(jiāng)會(huì)碰撞到動態(tài)的collider,那麽(me)檢測模式(shì)應該選擇連續或者連續動態檢測(cè)。這(zhè)樣可以很好(hǎo)的避免穿透現象。
然後,你以為這樣就(jiù)高枕勿(wù)憂了麽?在實際(jì)的項目中,我們(men)可能會發(fā)現,我們剛(gāng)體上已經選擇了連續檢測甚(shèn)至連續動態檢測,依(yī)舊會有穿透問題,這就是我上麵列(liè)舉的兩條(3條),被碰撞體的碰撞器太薄,被碰撞體的速度太快。這樣依(yī)舊會導致穿透,那麽(me)原理是什麽(me)?我們知道(dào)unity中有fixedupdate,update這些更新方法,而這些更新中,都是有時間間隔更新的,更新的(de)時候是用基礎(chǔ)速度*時(shí)間,很有可能這個結果計算出來的時(shí)候車已經(jīng)衝過了被(bèi)碰撞體(tǐ),就導致了我們(men)的角色穿透,或者卡在被碰撞器的裏麵。
so,知(zhī)道了(le)這些(xiē),我們在項目中就知道如何(hé)規避這(zhè)些“bug”了
- 上一篇:VS2010中配置Openframework 2018/4/26
- 下一篇:wonglove力反(fǎn)饋器支持UNITY3D開發 2018/4/23