2016-06-20 38 views
0

我正在嘗試製作2D遊戲引擎,但似乎無法讓碰撞始終發揮作用(通常情況下卡住或彼此通過)。沒有太多的代碼,這裏是我更新的順序。碰撞檢測和響應的正確操作順序是什麼?

  1. 獲取用戶輸入和更新播放速度
  2. 保存每個實體的位置,然後移動速度/更新間隔單位
  3. 檢查各活動單位針對所有其他實體碰撞。如果實體與某物發生碰撞,則將其移至其舊位置,併爲兩個碰撞實體設置新的速度。

碰撞衝動在這個函數計算:

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; 
      } 
     } 

我一直在努力調整代碼爲幾天,但我無法弄清楚什麼是錯的。我希望有一些新鮮的眼睛能夠讓我瞭解我的困境。

+0

您觀察到的不良影響是什麼? – heltonbiker

+0

有很多,因爲我一直在改變代碼。第一個是如果A在B旁邊,並且他們幾乎不接觸,並且A向左移動,B通過A.有時A和B彼此卡住。 –

回答

1

步驟3中存在一個根本性問題「如果實體與某物發生碰撞,則會移動到其舊位置......」 - 因爲您現在再次移動此實體,您需要重新運行碰撞檢測針對此實體之前的所有實體,否則可能會導致重疊。

E.g.如果你有3個球池(A,B,C),你將所有3個球移到他們想要的新位置A',B',C'(在步驟2中)。現在對於第3步你檢查和A'B'和A'C'不會碰撞,他們不會,但是然後你檢查B'C',他們確實碰撞,所以在你的解決方案你移動B',C 「回到B,C - 但現在技術上你可能已經搬到B和/或C,所以它現在A.

相交當您第3步的工作,你要麼需要:

1)確保沒有對象在開始時重疊,並且每當在步驟3中檢測到碰撞時(a)重新運行前面所述的每個先前對象都未與這些對象發生碰撞的碰撞,或者繼續重新運行整個步驟3直到最後一個循環中沒有對象被重置。如果你有很多對象並且它們都開始重新設置對方,這可能會變得很昂貴。

或:

2)不是每次都重新設置對象的最後一幀的「安全」的位置,合力(所以加速,不速度)有關的對象多少相互滲透。這在3D物理引擎中很常見,如果它們相互滲透太多,會導致對象爆炸。另外請注意,如果您曾經在一幀中移動過很遠的物體(例如超過一半的大小),它可能會在沒有碰撞重疊檢測觸發的情況下通過另一個物體。這通常稱爲透過紙張問題

+0

我在一兩個星期前得出同樣的結論。第3步需要遞歸移動實體,如果它們相互碰撞,但是你解釋它的方式也有很多意義。 –