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