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