У своєму двигуні 2D фізики я можу виявити зіткнення AABB проти AABB і вирішити їх, знайшовши найкоротший вектор проникнення і додавши його до положення AABB.
Це "виштовхує" перший AABB за межами другого AABB, але зовсім не займається змінами швидкості / прискорення.
Якщо додати своє прискорення сили тяжіння до свого моделювання, швидкість першого динамічного AABB продовжує зростати, навіть коли він опирається поверх другого статичного AABB. Врешті-решт швидкість стане надто великою і зіткнення не буде виявлено (динамічний AABB провалиться через статичний).
Я спробував встановити швидкість до нуля після роздільної здатності, але це, очевидно, не спрацювало добре, і створив нереальні симуляції.
Я читав в Інтернеті, що розв'язання зіткнень шляхом ручної роботи в положенні або швидкості не є правильним. Я спробував реалізувати сили (маса зараз є «жорстким кодом»):
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