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