2D fizik motorumda, AABB ve AABB çarpışmalarını tespit edebilir ve en kısa penetrasyon vektörünü bularak ve AABB'nin pozisyonuna ekleyerek bunları çözebilirim.
Bunu yapmak ilk AABB'yi ikinci AABB'nin dışına "iter", ancak hız / ivme değişiklikleriyle hiç ilgilenmez.
Simülasyonuma yerçekimi ivmesi eklersem, ilk dinamik AABB'nin hızı, ikinci statik AABB'nin üzerine otursa bile büyümeye devam eder. Sonunda, hız çok büyük olacak ve çarpışma algılanmayacak (dinamik AABB statik olandan düşecektir).
Çözünürlükten sonra hızı sıfıra ayarlamaya çalıştım, ama açıkçası işe yaramadı ve gerçekçi olmayan simülasyonlar yarattı.
Çevrimiçi olarak pozisyon veya hız üzerinde manuel olarak çalışarak çarpışmaların çözülmesinin doğru olmadığını okudum. Kuvvetleri uygulamayı denedim (kütle şimdilik "kodlanmış" 1):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
En kısa penetrasyon vektörünü çarpışma çözünürlüğü sırasında bir kuvvet olarak uygularsam, dinamik AABB statik olandan "dışarı itilir", ancak yerçekimsiz bir simülasyonda hızı asla düşmeyecek ve sonsuza kadar hareket etmeye devam edecektir.
"Geçici" bir kuvvet uygulamak için bir yol var mı? İlk AABB'yi ikinci AABB'nin dışına itme ile ilgilenen bir güç, daha sonra AABB artık çarpışmadığında durur mu?
Tüm kaynak kodu burada bulunabilir: https://github.com/SuperV1234/SSVSCollision