在遊戲戰鬥中,我們會用到各種各樣的碰撞檢測,來判斷是否打中了目標
比如扇形檢測/圓形檢測
還有矩形檢測,王者榮耀裡后羿的大招就是乙個很長的矩形碰撞體
這些在unity3d引擎中其實都封裝好了一些collider元件去檢測碰撞,但是我最近寫幀同步演算法的時候,發現u3d中的碰撞演算法執行順序不可控,會導致不同步的現象,所以就只好苦逼的自己寫碰撞檢測演算法了。
我們遊戲是乙個3d動作類遊戲,大概的碰撞可以分為幾類
圓柱體(把人/怪物的碰撞設定位乙個圓柱體,u3d裡是膠囊體,是為了解決一些邊緣精度問題,但是我們遊戲裡的話圓柱就夠用了)
球體立方體
需要檢測的碰撞有
1.檢測圓柱體跟球體的碰撞
2.立方體跟圓柱體的碰撞
具體實現:
1.球體跟圓柱體碰撞檢測
1 /// 2 /// 檢測球體跟圓柱體碰撞1.檢測兩個圓有沒有相交3 ///
4 /// 球體x
5 /// 球體y
6 /// 球體z
7 /// 球體半徑
8 /// 圓柱體x
9 /// 圓柱體y
10 /// 圓柱體z
11 /// 圓柱半徑
12 /// 圓柱體高度
13 public static bool checkcircleandcylindercollider(float x1, float y1, float z1, float r1,
14 float x2, float y2, float z2, float r2, float h2)
15
2.檢測y軸的距離是否小於球半徑+圓柱體高度的一半
這裡是把球體也當成了圓柱體進行檢測,好處就是:效率高。 缺點是:不精確,沒有考慮x,z軸的旋轉
但由於我們遊戲中圓柱體不會有x,z軸的旋轉,所以這樣的做法是最高效的
精確性問題:把圓柱體變成膠囊體,兩端用兩個球體來計算檢測,這樣會更精確,同時效能也會降低
2.立方體跟圓柱體的碰撞
這裡先把問題簡化成矩形跟圓形的碰撞檢測
計算方法是先找到矩形上離圓形最短距離u,然後再比較u是否小於圓形的半徑r
1. 首先利用絕對值把 p - c 轉移到第一象限,下圖顯示不同象限的圓心也能對映至第一象限,這不影響相交測試的結果:
2. 然後,把 v 減去 h,負數的分量設定為0,就得到圓心與矩形最短距離的向量 u。下圖展示了4種情況,紅色的u是結果。
最後要比較u和r的長度,若距離少於r,則兩者相交。可以只求u的長度平方是否小於r的平方
對於aabb包圍盒,這樣就已經可以檢測碰撞了,但是如果矩形是旋轉的obb包圍盒呢?
我這裡是實現了乙個obb的包圍盒類,記錄了座標,角度,碰撞檢測的時候先把圓的角度旋轉到obb的座標系裡
利用旋轉公式:
x2 = x * mathf.cos(rad) - z * mathf.sin(rad);然後再用那篇文章裡說的方式計算矩形跟圓是否相交z2= x * mathf.sin(rad) + z * mathf.cos(rad);
最後再通過兩者 y軸的距離 < (圓柱體高度+立方體的高度)/2 ,如果小於則相交
這種方法的優勢:效率高,而且精確
缺點是這個3d的obb只能沿y軸旋轉,不過也夠用了
如果像王者榮耀型別的遊戲,感覺不需要擴充套件到3d,2d檢測應該就夠用了
posted @
2017-04-16 15:03
李嘉的部落格 閱讀(
...)
編輯收藏
Unity3D 碰撞測試
碰撞測試這個再遊戲的開發中是很有必要的,當敵人的攻擊的時候,發生碰撞這時候就會造成一定的傷害,因此我們需要根據受到的傷害對使用者的生命值進行控制,因此碰撞的測試是 我們在遊戲的開發過程中需要的一種比較重要的資料。在unity中的碰撞測試有兩種,一種是碰撞,一種是觸發!一種屬於物理碰撞,一種屬於非物理...
unity3d碰撞檢測
具體的一些,可以看 unity3d的 manual refrernce的東西,有幾個 在後面可以參考 幾個型別碰撞器 1.靜態碰撞器 就是只有碰撞器,但沒有剛體的 2.剛體碰撞器 帶rigidbody的碰撞器,這個是最基本的碰撞器 3.運動學剛體碰撞器 帶rigidbody,而且rigidbody的...
Unity3d 碰撞檢測
unity3d 主要由trigger和collison 兩種碰撞檢測 1 檢測trigger 雙方都有collider。雙方至少有乙個rigidbody 任意一方都可以 有乙個trigger 任意一方都可以 若只有乙個rigidbody,則碰撞時,該rigidbody一定要是運動的。碰撞後發出的on...