Dalam mesin fisika 2D saya, saya dapat mendeteksi tabrakan AABB vs AABB, dan mengatasinya dengan menemukan vektor penetrasi terpendek dan menambahkannya ke posisi AABB.
Melakukan ini "mendorong" AABB pertama di luar AABB kedua, tetapi sama sekali tidak berurusan dengan perubahan kecepatan / akselerasi.
Jika saya menambahkan percepatan gravitasi ke simulasi saya, kecepatan AABB dinamis pertama terus tumbuh bahkan ketika itu berada di atas AABB statis kedua. Akhirnya, kecepatan akan menjadi terlalu besar dan tumbukan tidak akan terdeteksi (AABB dinamis akan jatuh melalui yang statis).
Saya mencoba mengatur kecepatan ke nol setelah resolusi, tetapi jelas tidak bekerja dengan baik, dan menciptakan simulasi yang tidak realistis.
Saya membaca secara online bahwa menyelesaikan tabrakan dengan bekerja secara manual pada posisi atau kecepatannya tidak benar. Saya mencoba menerapkan kekuatan (massa adalah "hardcoded" 1 untuk saat ini):
void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }
void Body::integrate(float mFrameTime)
{
velocity += acceleration * mFrameTime;
position += velocity * mFrameTime;
acceleration = {0, 0};
}
Jika saya menerapkan vektor penetrasi terpendek sebagai kekuatan selama resolusi tabrakan, AABB dinamis akan "didorong keluar" dari yang statis, tetapi kecepatannya tidak akan pernah berkurang dalam simulasi tanpa gravitasi dan akan terus bergerak selamanya.
Apakah ada cara untuk menerapkan kekuatan "sementara"? Suatu kekuatan yang berurusan dengan mendorong AABB pertama dari AABB kedua, lalu berhenti ketika AABB tidak bertabrakan lagi?
Seluruh kode sumber tersedia di sini: https://github.com/SuperV1234/SSVSCollision