Unity Rigidbody碰撞穿透

2022-07-01 21:15:09 字數 1880 閱讀 9806

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

發生概率即觸發方式:

1.剛體速度足夠快,被撞物體的collider足夠薄。

2.剛體速度在一定的v,被撞物體也在一定的速度v(被撞物體可移動)。

3.暫時未發現的其他情況。

在分析這兩種(3種)情況之前,先了解下乙個剛體(rigidbody)屬性引數:collision detection(碰撞檢測):

它有三種選項:discrete(離散),continuous(連續),continuous dynamic(動態連續),我們參考下官方的解釋:

該屬性用於控制避免高速運動的遊戲物件穿過其他的物件而未發生碰撞,有三項可供選擇

discrete:離散碰撞器。該模式與場景中其他的所有碰撞體進行碰撞檢測。該項為預設值。

continuous:連續碰撞檢測。該模式用於檢測與動態碰撞體(帶有rididbody)的碰撞,使用連續碰撞檢測模式來檢測與網格碰撞體(不帶ridigbody)碰撞。(新增一句原文翻譯漏了),rigidbody設定為連續動態碰撞檢測模式將使用連續碰撞來檢測。其他剛體會採用離散碰撞模式。此模式適用於那些需要與採用連續動態檢測的物件相碰撞的物件。這對物理效能會有很大影響,如果不需要對快速運動物件進行碰撞檢測,就使用離散碰撞檢測模式。

continuous dynamic:連續動態碰撞檢測模式,該模式用於檢測與採用連續碰撞撞模式或連續

動態碰撞模式物件的碰撞,也可用於檢測沒有rigidbody的靜態網格碰撞體。對於與之碰撞的其他物件可採用離散碰撞檢測。動態連續碰撞檢測模式也可用於檢測快速運動的遊戲物體

翻譯就是這樣的理解並不難:後面兩項就是為了用來能夠檢測到快速運動的物體不至於

你的void oncollisionenter(collision hit)函式檢測不到,而至於乙個為continuous dynamic的剛體和乙個discrete的剛體碰撞,前者會使用使用continous(連續)碰撞,後

者離散碰撞

再來總結下:當使用預設的離散式碰撞檢測時,如果前一楨時物件在牆這一面,下一楨時物件已到到了牆另一面,那麼碰撞檢測演算法將檢測不到碰撞的發生,你可以將該物件的碰撞檢測屬性設定為continuous,這時碰撞檢測演算法將會防止物件穿過所有的靜態碰撞體設定為continuous dynamic將還會防止穿過其他也設定為continuous或者continuous dynamic的剛體

這就很好理解,如果我們的主角在運動中碰到的都是靜態collider,那麼使用離散檢測是可以滿足的。如果我們在遊戲中,主角將會碰撞到動態的collider,那麼檢測模式應該選擇連續或者連續動態檢測。這樣可以很好的避免穿透現象。

然後,你以為這樣就高枕勿憂了麼?在實際的專案中,我們可能會發現,我們剛體上已經選擇了連續檢測甚至連續動態檢測,依舊會有穿透問題,這就是我上面列舉的兩條(3條),被碰撞體的碰撞器太薄,被碰撞體的速度太快。這樣依舊會導致穿透,那麼原理是什麼?我們知道unity中有fixedupdate,update這些更新方法,而這些更新中,都是有時間間隔更新的,更新的時候是用基礎速度*時間,很有可能這個結果計算出來的時候車已經衝過了被碰撞體,就導致了我們的角色穿透,或者卡在被碰撞器的裡面。

so,知道了這些,我們在專案中就知道如何規避這些「bug」了。

不能碰這個

的目的是做static cast型別之間的轉換沒有正常執行時檢查。c 提供了鑄件,其他幾種型別包括dynamic cast,reinterpret cast,和const cast,都具有不同的行為。用c語言風格的鑄造的問題是,它可以用乙個static cast,reinterpret cast,或...

初碰python感受

對於python,提起我興趣的就是python的爬蟲。我們小組的領導就是乙個python,php兼備的大佬,我到公司的第一步就是啟動領導寫好的爬蟲爬取網頁的資料,只需要啟動後,網頁就自動開啟開始運作,這個真的很吸引人。對於乙個希望提公升自己的人來說,學習感興趣方面的東西對知識的提公升是最快的也是最舒...

低速前碰開發

為實現車輛在10km h的速度下,當檢測到前方有障礙物 車 的同時,能夠給與駕駛員報警提示,並且在碰撞發生前,自主響應剎車系統避免碰撞的發生。嘗試開發低速前碰功能。確認所需求的輸入輸出訊號。輸入訊號 abs輸入當前車速資訊,前向超聲波雷達輸入前方障礙物的距離等資訊 輸出訊號 輸出報警聲音資訊,輸出制...