带有Farseer Physics的C#XNA中的OnCollision事件处理程序问题

前端之家收集整理的这篇文章主要介绍了带有Farseer Physics的C#XNA中的OnCollision事件处理程序问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我现在在我的游戏中有这个工作正常(ish),但我在数学方面并不出色.当两个原发性物质发生碰撞时,如果施加于原色的力超过设定的阈值,我希望它们粉碎成微小的碎片.我目前的碰撞事件处理程序看起来像这样.
public bool Collision(Fixture fixtureA,Fixture fixtureB,Manifold manifold) 
{ 
   Vector2 position = manifold.LocalNormal; 
   float angle = (float)Math.atan2(position.Y,position.X); 
   Vector2 force = Vector2.Zero; 
   if (angle < 0) 
     force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X),(float)Math.Sin(MathHelper.TwoPi + angle) * fixtureA.Body.LinearVelocity.Y); 
   else 
     force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X),(float)Math.Sin(MathHelper.TwoPi - angle) * fixtureA.Body.LinearVelocity.Y); 
   double XForce = Math.Sqrt(force.X * force.X); 
   double YForce = Math.Sqrt(force.Y * force.Y); 
   double totalForce = XForce + YForce; 
   if ((Breakable) && (totalForce > BreakForce)) 
   { 
      Breakable = false; 
      Active = false; 
      BreakUp(fixtureA,fixtureB); 
   } 
   return true; 
}

我是在很久以前刚刚玩的时候把它放的.这在某些情况下会引起一些问题.例如,如果一个灵长类固定在地板上而另一个灵长类动物从一个体面的高度落到它上面,几乎总是如此,掉落的盒子会爆炸并且休息盒会存活下来.此外,如果两个盒子并排落下并互相给予最小的触摸,那么两个盒子都会吹到半空中.嗯,不是那么完美.有谁知道如何改进我的碰撞处理程序?提前致谢.

解决方法

(虽然这是目前接受的答案 – 我会指示任何人使用我的 other answer以获得潜在的优势方法.)

你对冲击力的计算是完全错误的.你需要在接触点获得相对速度 – 你得到的东西很奇怪……

您的代码看起来像是使用Farseer 3.0(您应该指定,因为它更像是Box2DX的分支而不是Farseer 2.1).我在Farseer 2.1(你有ContactList联系人而不是Manifold)中做的是获得冲击速度:

foreach(Contact contact in contacts)
{
    Vector2 position = contact.Position;
    Vector2 v0;
    me.Body.GetVelocityAtWorldPoint(ref position,out v0);
    Vector2 v1 = new Vector2();
    if(!hit.Body.IsStatic)
        hit.Body.GetVelocityAtWorldPoint(ref position,out v1);
    v0 -= v1;

    float hitVelocity = v0.Length();
    // To then get the force,you need the mass of the two objects
}

从简短的Farseer 3.0源代码看,Manifold似乎有一个成员:

public FixedArray2<ManifoldPoint> Points;

Manifold和ManifoldPoint都有成员:

public Vector2 LocalPoint;

修改我的Farseer 2.1代码以使用它们应该相当简单.

另外:我建议简单地将两个对象标记为需要中断,然后在物理更新完成运行后实际打破它们(而不是在碰撞处理程序中).

猜你在找的C&C++相关文章