1. 程式人生 > >三種常用碰撞類型的實現(Box,Sphere,CapsuleCollider)及接觸點獲取

三種常用碰撞類型的實現(Box,Sphere,CapsuleCollider)及接觸點獲取

info 分享圖片 html 實現 狀態 ide aps image src

技術分享圖片

git地址:https://gitee.com/Hont/ColliderDemo

大致邏輯說一下,首先每一種碰撞器需要一套質點到該碰撞器相應邊緣點的函數,後續不同類型的碰撞器都是基於這套接口實現的。

對於特殊的碰撞器也可以不實現這個接口,只在特殊場合使用這些特殊碰撞。

那麽實現這套接口需要一些求交點函數,代碼裏都實現了,包括球體還有柱形的求交點函數都來源於網絡,所以性能這方便差一些。

球體求交點直接從圓形的交點獲取擴展:https://www.cnblogs.com/hont/p/8991751.html

平面求交點:http://www.cnblogs.com/hont/p/7467618.html

當求邊緣點的函數有了之後,就可以進行具體形狀的碰撞檢測了,例如膠囊可以拆分為上下兩個球的碰撞和中間的柱形碰撞。

直接求出其他常規類型碰撞器的邊緣點之後再拿邊緣點和膠囊做一次包含關系檢測即可。當然中間的柱形要做一次投影。

上面的說法不包括一些凸包凹包的非常規碰撞,其他兩種碰撞直接通過邊緣點做檢測即可。

另外相交點做了一個保留處理,即不在相交狀態,或者變為包含狀態時依舊可以獲取得到舊的相交點。並且這裏的相交點並不是準確接觸點

但可以通過擴展計算更精確的接觸點,所以能看見gif圖中接觸點在包含時有一些不準確的跳動。畢竟遊戲中很多接觸產生的特效位置是按照關節來的。

配合射線可以和unity自身碰撞器有良好的交互。

總之還不太完善,在實際項目中再去不斷優化。

三種常用碰撞類型的實現(Box,Sphere,CapsuleCollider)及接觸點獲取