Применение коэффициента реституции в методе разрешения коллизий

2

У меня есть метод разрешения конфликтов в моем физическом движке, который выглядит следующим образом:

Vector2 n1pos = n1.NonLinearSpace != null ? n1.NonLinearPosition : n1.Position;
Vector2 n2pos = n2.NonLinearSpace != null ? n2.NonLinearPosition : n2.Position;
Vector2 posDiff = n2pos - n1pos;
Vector2 posDiffNormal = posDiff;
posDiffNormal.Normalize();
float totalRadius = n1.Radius + n2.Radius;
float posDiffLength = posDiff.Length();
float interPenetration = totalRadius - posDiffLength;
float averageRestitution = (n1.RestitutionCoefficient + n2.RestitutionCoefficient) / 2;

Vector2 forceAmount = Vector2.Multiply(posDiffNormal, interPenetration);
Vector2 n1force =
    (
        (n1.Velocity * n1.Mass) +
        (n2.Velocity * n2.Mass) +
        n2.Mass * averageRestitution * (n2.Velocity - n1.Velocity)
    ) /
    (n1.Mass + n2.Mass);
Vector2 n2force =
    (
        (n1.Velocity * n1.Mass) +
        (n2.Velocity * n2.Mass) +
        n1.Mass * averageRestitution * (n2.Velocity - n1.Velocity)
    ) /
    (n1.Mass + n2.Mass);
n1.ApplyForce(???);
if (!n1.IsStatic)
{
    n1.Position += ???;
}
n2.ApplyForce(???);
if (!n2.IsStatic)
{
    n2.Position += ???;
}

Теперь я не могу понять, что нужно применять к телам моего двигателя, чтобы получить правильный коэффициент реституции. (части). Может кто-нибудь помочь?

Теги:
physics
xna

2 ответа

6

Судя по этому и вашим другим вопросам, вы пытаетесь запустить, прежде чем сможете ходить.

  • Вы пытаетесь скомпоновать несколько незнакомых вещей сразу, когда вы должны решать их по одному за раз. Попробуйте установить коэффициент restituation равным 0, чтобы ваши объекты действовали как куски шпатлевки. Это будет легче закодировать, и как только у вас будет такая работа, вы сможете попробовать упругие столкновения.
  • Не обижайтесь, но попытка написать физический движок, когда вы не изучали основную физику, просто мазохистская. Вы можете либо садиться с учебником, либо экспериментом, но просто нет возможности заставить двигатель работать, не понимая его частей.
  • 0
    Хорошо, вот в чем дело: я учусь гораздо эффективнее на примере, чем на многих математических уравнениях и правилах, изложенных в книге. Тем не менее, я получил шанс изучить физический движок и в основном издевался над этой архитектурой. То, как столкновения вычисляются прямо сейчас, все столкновения полностью эластичны, поэтому я не могу начать с «замазок». Метод, который я попробовал для интеграции расчетов CoR, был неверным, поэтому ваша помощь очень ценится.
5

Я понимаю, что это старый вопрос, но я столкнулся с той же проблемой, и Google поднял эту страницу. Я решил, что могу поделиться своими выводами. Во-первых, вы должны понимать, что коэффициент реституции является свойством столкновения, а не любого из тел, участвующих в столкновении. То есть для n объектов вам нужно определить n (n-1)/2 коэффициентов реституции (по одной для каждой пары тел).

Однако физики, которые я изучил (Bullet, Chipmunk, Box2d), определяют реституцию как свойство тел. Во время столкновения они объединяют коэффициенты реституции двух тел в одно значение и используют это в разрешении столкновения. Очевидно, это физически не правильно. Но это не имеет большого значения для игр: просто нужно вести себя интуитивно. Вот функции реституции, которые используют эти физические двигатели:

  • Bullet: restitution = body1->restitution * body2->restitution
  • Бурундук: restitution = body1->restitution * body2->restitution
  • Box2d: restitution = max(body1->restitution, body2->restitution)

Box2d позволяет пользователям настраивать функцию реституции в файле конфигурации. Пуля и бурундук не делают.

Я рекомендую вам выбрать, какая функция ремикс-микширования лучше всего подходит. Просто поиграйте с ним немного и посмотрите, что вам нравится.

  • 0
    Хорошее исследование. Я гуглил ту же проблему. У меня было ощущение, что умножение значений материальной реституции - лучший способ, а усреднение будет следующим. Использование max кажется мне неправильным, хотя min может иметь смысл. Это , кажется, не имеет значения слишком много, так долго , как вы объединить их каким - то образом (как с использованием отдельных значений в каждом уравнении скорости не сохраняет импульс). Исходя из этого, я буду умножать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню