碰撞算法一般在很多物理引擎裡面都能看到其身影
物理引擎
物理引擎都有基本的 碰撞,剛體,重力等基本功能
如
PhysX: unity引擎和ue4引擎使用
Havok: Frostbite(寒霜) 引擎使用 還有大名鼎鼎的<<塞爾達荒野之息>> 也是使用的這個
Box2D: cocos 2D引擎使用 憤怒的小鳥使用
Chipmunk: cocos 2d引擎使用
其中physx 和havok為3D物理引擎. 更有很多複雜功能 水(流體),爆炸模擬(粒子),衣服布料模擬(軟體)等等.
碰撞體
如 我們遊戲開發目前使用最多的unity使用的physx
physx中的碰撞體collider
1. box collider
2. Sphere collider
3. Capsule collider
4. Mesh collider除了meshCollider 是不規則的形狀 來判斷碰撞,同時為了性能 物理引擎也本身限制了 mesh collider不超過200個面其他幾個 collider都很好理解
碰撞原理
言歸正傳說到碰撞算法 以上介紹的物理引擎 其實都是開源的 可以下載源碼看到裡面的內部實現. 可以看到各種引擎的碰撞算法幾乎都是一致的.
無非就是把物理放入各種包圍盒, 再判斷包圍盒的範圍判斷出碰撞
包圍盒種類
1. AABB包圍盒
2. sphere包圍球
3. obb方向包圍盒
4. fdh固定方向凸包
aabb包圍盒檢查碰撞
2D下的應用
Data Class GameObj( Var xmin: int, Var xmax: int, Var ymin: int, Var ymax: int)
Fun check(obj1: GameObj, obj2:GameObj){ if(obj1.xmin <= obj2.xman && obj1.ymin <= obj2.ymax && obj1.xmax >= obj2.xmin && obj1.ymax <= obj2.ymin ){ return true } return false }
3D下的應用
同理 只是加一個Z的判斷.
sphere包圍球檢查碰撞
2D下的應用
Data Class Point( Var x: float, Var y: float)
Data Class GameObj( Var point: Point = 1 Var radius: int = 2)
Fun distance(p1: Point, p2 :Point){ return Math.sqrt(Math.abs((p1.x - p2.x)*(p1.x1 - p2.x))+Math.abs((p1.y - p2.y)*(p1.y - p2.y)))}
Fun check(obj1: GameObj, obj2:GameObj){If(obj1.radius + obj2.radius > distance(obj1.point, obj2.point)){ return true } return false }3D下同理
所有的碰撞檢測都是基於這些基本算法拓展而來
碰撞算法->包圍盒->碰撞體->物理引擎
在遊戲引擎端直接使用物理引擎
Unity裡面 一幀的邏輯 簡單濃縮一下
n次fixUpdate ()-> update ()-> render()
物理引擎則在fixupdate()裡面每幀的計算