(Хотя это в настоящее время принятый ответ - я бы направил любого на мой другой ответ для потенциально более эффективного подхода.)
Ваш расчет силы удара полностью неверен. Вам нужно получить относительную скорость в точке (точках) контакта - вы получаете что-то довольно странное ...
Ваш код выглядит так, как будто он использует Farseer 3.0 (вам следует указать, потому что это скорее форк Box2DX, чем Farseer 2.1). То, что я сделал в Farseer 2.1 (где у вас есть ContactList contacts
вместо 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, чтобы использовать их вместо этого.
Также: я рекомендую просто пометить два объекта как нуждающиеся в разрыве, а затем фактически разбить их после Ваше обновление физики завершится (а не в обработчике столкновений).