我正在嘗試製作2D遊戲引擎,但似乎無法讓碰撞始終發揮作用(通常情況下卡住或彼此通過)。沒有太多的代碼,這裏是我更新的順序。碰撞檢測和響應的正確操作順序是什麼?
- 獲取用戶輸入和更新播放速度
- 保存每個實體的位置,然後移動速度/更新間隔單位
- 檢查各活動單位針對所有其他實體碰撞。如果實體與某物發生碰撞,則將其移至其舊位置,併爲兩個碰撞實體設置新的速度。
碰撞衝動在這個函數計算:
private static void CollisionImpulse(PhysicsEntity a, PhysicsEntity b)
{
var relative = b.Velocity.Vector - a.Velocity.Vector;
var normal = Vector2.Normalize(relative);
var e = Math.Min(a.Material.Elasticity, b.Material.Elasticity);
var j = (-(1 + e) * Vector2.Dot(relative, normal))/
(Vector2.Dot(normal, normal) * (a.InverseMass + b.InverseMass));
if (double.IsNaN(j)) return;
var velocityA = normal * (float) (j/a.Mass);
var velocityB = normal * (float) (j/b.Mass);
a.Velocity.X -= velocityA.X;
a.Velocity.Y -= velocityA.Y;
if (!b.Movable) return;
b.Velocity.X += velocityB.X;
b.Velocity.Y += velocityB.Y;
b.Position = b.OldPosition;
}
,這是檢查碰撞的功能:
public override void Update()
{
foreach (var entity in Universe.PhysicsEntities)
{
if (entity.Equals(this) || entity.Collided) continue;
CollisionResolution.ResolveCollision(this, entity);
if (!Collided) continue;
Position = OldPosition;
break;
}
}
我一直在努力調整代碼爲幾天,但我無法弄清楚什麼是錯的。我希望有一些新鮮的眼睛能夠讓我瞭解我的困境。
您觀察到的不良影響是什麼? – heltonbiker
有很多,因爲我一直在改變代碼。第一個是如果A在B旁邊,並且他們幾乎不接觸,並且A向左移動,B通過A.有時A和B彼此卡住。 –