В моем 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