В моем 2D физическом движке я могу обнаружить столкновения AABB и AABB и разрешить их, найдя кратчайший вектор проникновения и добавив его в позицию AABB.
Выполнение этого «выталкивает» первую AABB за пределы второй AABB, но вообще не имеет дело с изменениями скорости / ускорения.
Если я добавлю ускорение силы тяжести в моё моделирование, скорость первой динамической AABB будет продолжать расти, даже когда она лежит поверх второй статической AABB. В конце концов, скорость станет слишком большой, и столкновение не будет обнаружено (динамическая AABB провалится через статическую).
Я попытался установить скорость на ноль после разрешения, но она явно не работала, и создал нереальные симуляции.
Я читал в Интернете, что разрешение столкновений путем ручной работы над положением или скоростью не является правильным. Я попытался реализовать силы (масса - «жестко закодированная» 1 на данный момент):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Если я применяю кратчайший вектор проникновения как силу во время разрешения столкновений, динамическая AABB будет «выталкиваться» из статической, но ее скорость никогда не будет уменьшаться в симуляции без гравитации и она будет продолжать двигаться вечно.
Есть ли способ применить «временную» силу? Сила, которая имеет дело с выталкиванием первой AABB из второй AABB, а затем останавливается, когда AABB больше не сталкивается?
Весь исходный код доступен здесь: https://github.com/SuperV1234/SSVSCollision
источник
Ответы:
Во-первых, я рекомендую использовать бесплатную физическую библиотеку с открытым исходным кодом, такую как Box2D, и просто сосредоточиться на тех аспектах вашей игры, которые делают ее уникальной! Если вы настаиваете на повторном изобретении колеса, читайте дальше ... обратите внимание, что все физические движки являются приблизительными, и хотя описанный ниже метод будет более точным, чем ваша текущая модель, результаты Box2D будут гораздо более реалистичными.
Для быстрого моделирования более точного разрешения столкновения двух объектов A и B:
Пожалуйста, взгляните на мою примерную программу астероидов, которая демонстрирует эти концепции.
Далее учтите сложенные объекты:
Как вы заметили, использование скорости для имитации сложенных / покоящихся объектов не работает должным образом: скорость - это скорость, с которой движется объект, поэтому, если он опирается на статический объект, скорость должна быть близка к 0. Увеличение не имеет смысла скорость объекта, чтобы он появился в покое:
Что в действительности должно произойти, так это сила ускорения, которая движется в противоположном направлении, поскольку гравитация должна нейтрализовать гравитацию. (Это называется нормальной контактной силой). Суть в том, чтобы просто не применять гравитацию к телам, которые не находятся в воздухе:
Обновить:
источник
Решение этой проблемы требует корректировки положения и, возможно, скорости. У двигателей физики твердого тела есть решатель, который продвигает объекты во времени, используя законы движения Ньютона, а также решает проблемы непроникания и трения. Эти двигатели могут вычислить правильную комбинацию линейного и углового движения для создания вероятных траекторий.
Если вы хотите разрешить только перекрытие, вы можете использовать псевдоскорости, которые генерируют разделяющие траектории без добавления импульса. Это делается в решателе положения Box2D.
Я рекомендую получать мои презентации GDC с 2006 и 2007 здесь:
http://code.google.com/p/box2d/downloads/list
Кроме того, вы можете взглянуть на Box2D Lite для упрощенной реализации.
источник
В реальном мире нет силы, которая «выталкивает» одно тело за пределы другого, потому что объекты никогда не проникают друг в друга. Самая близкая вещь - нормальная сила : созданная в момент контакта в реальных столкновениях, она предотвращает проникновение в первую очередь.
Угол этой нормальной силы перпендикулярен поверхности контакта двух сталкивающихся объектов. Величина зависит от того, сколько сил необходимо для предотвращения проникновения. (Обратите внимание, что следует использовать только компонент y нормальной силы, если только другие силы, такие как сила трения, также не смоделированы).
Хотя можно явно моделировать нормальную силу, проще моделировать только ее эффекты:
Я описал это немного иначе в своем другом ответе, который больше касается столкновений в целом .
источник