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
sumber
Jawaban:
Pertama, saya sarankan menggunakan perpustakaan fisika open-source gratis seperti Box2D dan hanya berfokus pada aspek permainan Anda yang membuatnya unik! Jika Anda bersikeras menciptakan kembali roda, baca terus ... perhatikan semua mesin fisika adalah perkiraan, dan sementara metode yang saya uraikan di bawah ini akan lebih akurat daripada model Anda saat ini, hasil Box2D akan jauh lebih realistis.
Untuk cara cepat memodelkan resolusi tabrakan yang lebih akurat dari dua objek A dan B:
Silakan lihat contoh program asteroid saya yang menunjukkan konsep-konsep ini.
Selanjutnya, akun untuk objek yang ditumpuk:
Seperti yang telah Anda catat, menggunakan kecepatan untuk mensimulasikan objek bertumpuk / beristirahat tidak berfungsi dengan baik: kecepatan adalah kecepatan suatu objek bergerak, jadi jika ia bersandar pada objek statis, kecepatannya harus mendekati 0. Tidak masuk akal untuk meningkatkan kecepatan suatu objek untuk membuatnya tampak diam:
Apa yang seharusnya benar-benar terjadi adalah gaya percepatan yang bergerak ke arah yang berlawanan karena gravitasi harus membatalkan gravitasi keluar. (Ini disebut kekuatan kontak normal). Cara pintas adalah dengan tidak menerapkan gravitasi pada benda yang tidak ada di udara:
Memperbarui:
sumber
Menyelesaikan masalah ini membutuhkan penyesuaian posisi dan kemungkinan kecepatan. Mesin fisika benda tegar memiliki pemecah benda yang bergerak maju dalam waktu menggunakan hukum gerak Newton sambil juga memecahkan kendala dan gesekan non-penetrasi. Mesin ini dapat menghitung kombinasi yang tepat dari gerakan linier dan sudut untuk menciptakan lintasan yang masuk akal.
Jika Anda hanya ingin menyelesaikan tumpang tindih, Anda dapat menggunakan kecepatan semu yang menghasilkan lintasan terpisah tanpa menambah momentum. Ini dilakukan pada pemecah posisi Box2D.
Saya merekomendasikan untuk mendapatkan presentasi GDC saya dari tahun 2006 dan 2007 di sini:
http://code.google.com/p/box2d/downloads/list
Juga, Anda dapat melihat Box2D Lite untuk implementasi yang disederhanakan.
sumber
Di dunia nyata, tidak ada kekuatan yang "mendorong" satu tubuh di luar tubuh lain karena benda tidak pernah saling menembus. Hal yang paling dekat adalah kekuatan normal : diciptakan pada saat terjadi kontak dalam bentrokan di dunia nyata, ia mencegah penetrasi sejak awal.
Sudut dari gaya normal ini adalah tegak lurus terhadap permukaan kontak dari dua benda yang bertabrakan. Besarnya tergantung pada seberapa besar kekuatan yang dibutuhkan untuk mencegah penetrasi. (Catat hanya komponen y dari gaya normal yang harus digunakan kecuali jika gaya lain seperti gaya gesek juga dimodelkan).
Meskipun dimungkinkan untuk memodelkan gaya normal secara eksplisit, lebih mudah memodelkan efeknya saja:
Saya menggambarkan ini sedikit berbeda dalam jawaban saya yang lain yang lebih banyak tentang tabrakan secara umum .
sumber