У меня есть метод разрешения конфликтов в моем физическом движке, который выглядит следующим образом:
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 += ???;
}
Теперь я не могу понять, что нужно применять к телам моего двигателя, чтобы получить правильный коэффициент реституции. (части). Может кто-нибудь помочь?
Судя по этому и вашим другим вопросам, вы пытаетесь запустить, прежде чем сможете ходить.
Я понимаю, что это старый вопрос, но я столкнулся с той же проблемой, и Google поднял эту страницу. Я решил, что могу поделиться своими выводами. Во-первых, вы должны понимать, что коэффициент реституции является свойством столкновения, а не любого из тел, участвующих в столкновении. То есть для n объектов вам нужно определить n (n-1)/2 коэффициентов реституции (по одной для каждой пары тел).
Однако физики, которые я изучил (Bullet, Chipmunk, Box2d), определяют реституцию как свойство тел. Во время столкновения они объединяют коэффициенты реституции двух тел в одно значение и используют это в разрешении столкновения. Очевидно, это физически не правильно. Но это не имеет большого значения для игр: просто нужно вести себя интуитивно. Вот функции реституции, которые используют эти физические двигатели:
restitution = body1->restitution * body2->restitution
restitution = body1->restitution * body2->restitution
restitution = max(body1->restitution, body2->restitution)
Box2d позволяет пользователям настраивать функцию реституции в файле конфигурации. Пуля и бурундук не делают.
Я рекомендую вам выбрать, какая функция ремикс-микширования лучше всего подходит. Просто поиграйте с ним немного и посмотрите, что вам нравится.