У меня в настоящее время это нормально (ish) в моей игре, но я не фантастичен в математике. Когда сталкиваются два примитива, я хочу, чтобы они разбивались на мелкие биты, если сила, приложенная к примату, была выше установленного порога. В данный момент мой обработчик событий столкновения выглядит так.Проблемы обработчика событий OnCollision в C# XNA с физикой Farseer
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;
}
Я положил это в ДЛИННОЕ время назад, когда я просто играл. Это вызывает некоторые проблемы в определенных ситуациях. Например, если примат неподвижен на полу, а другой примат падает на него с приличной высоты, почти всегда, падающая коробка взрывается, и покоящаяся коробка выживает. Также, если две коробки падают бок о бок и дают друг другу самые маленькие касания, то обе коробки взрывают воздух. Хммммм, это не совсем прекрасно. Кто-нибудь знает, как улучшить мой обработчик столкновений? Заранее спасибо.
Hi Andrew, Спасибо за ваш ответ. Моя функция BreakUp() просто добавляет загрузку новых примитивов в список, основанный на позиции преломляющего примитива (чипы, если хотите), они не добавляются до следующей физики «Step()». Аналогично, уничтожаемый ящик просто помечен для удаления в следующем столбце. Итак, в вашем примере ... Я бы правильно использовал LocalPoint, а не переменную положения в вашей функции? Также я вижу, что это создает переменную hitVelocity, но я не уверен, как это относится к силе, применяемой к объекту. Я знаю, что F = MA, но здесь нет никаких углов? – DrLazer
Да, используйте LocalPoint. Моя переменная Position находится в мировом пространстве (так что найдите локальный эквивалент пространства GetVelocityAtWorldPoint). Чтобы найти силу, вам понадобится ускорение (F = MA). Вы можете аппроксимировать ускорение, определяя, насколько скорость изменится в этом кадре (разница в скорости, деленная на время). –
См. Также: http://en.wikipedia.org/wiki/Impulse_(physics) –