Dalam mesin fisika yang saya kembangkan (untuk belajar) menggunakan love-2d , saya menerapkan resolusi tabrakan dengan cara ini:
FixedUpdate(dt) // I use fixed timestep
foreach collide c1 in allNotStaticColliders
c1.integartePhysic // i.e. apply gravitational force..
foreach collider c2 "near" c1 // "near"= I use spatial hashing
if collide(c1,c2)
resolve collision (c1,c2) // the heavy operation
collison callbacks c1
collison callbacks c2
...
Seperti yang dapat Anda lihat di akhir animasi gif, ada pembusukan FPS ketika semua colliders hampir di-ground-kan pada objek statis.
Ini karena jumlah resolusi tabrakan tumbuh sebagai objek menghabiskan lebih banyak waktu menyentuh saat mereka menyelesaikan. Namun, banyak perhitungan yang "tidak berguna" karena benda-benda telah menetap di posisi yang stabil terhadap satu sama lain.
Apa praktik terbaik (mudah-mudahan tidak memerlukan gelar fisika) untuk menghindari deteksi tabrakan "tidak berguna" ini?
Edit: petunjuk DMG yang diterima dan sampai pada hasil ini (belum optimal)
(Merah = statis, Biru = aktif, Hijau = tidur)
sumber
Jawaban:
Saya menduga OP sudah tahu pendekatan ini, jadi saya sebutkan di komentar sebagai titik awal, tapi saya akan mencoba menyempurnakannya ...
Sebagian besar mesin fisika membagi benda dinamis menjadi dua kelompok, " terjaga ," dan " tidur ."
Objek tidur ketika mereka duduk diam, dan bangun ketika digerakkan atau dipercepat oleh pengaruh luar.
Sebuah tidur objek berperilaku seperti objek statis dalam banyak hal - gerakannya tidak terintegrasi dari waktu ke waktu (karena saat istirahat, sehingga tidak memiliki gerakan) dan pengabaian mesin tabrakan antara benda-benda yang tidur atau statis.
Objek tidur yang duduk di lantai statis tidak jatuh melewatinya, meskipun tidak ada respons tabrakan, karena semua integrasi gerakan dilewati untuk objek tidur, termasuk gravitasi.
Jadi, hanya tabrakan yang melibatkan setidaknya satu objek dinamis yang terjaga yang perlu diperiksa:
Ini secara dramatis dapat mengurangi jumlah objek yang memerlukan simulasi aktif, terutama dalam tumpukan yang seperti diilustrasikan dalam pertanyaan memiliki banyak benturan timbal balik untuk memeriksa sedikit atau tidak ada pergerakan net.
Tidur hanya membantu setelah benda benar-benar mencapai istirahat, yang mungkin memakan waktu cukup lama.
Beberapa hal yang dapat Anda lakukan untuk mencapai istirahat lebih cepat:
Miliki kecepatan atau momentum minimum nol, dan jepit apa pun yang jatuh di bawahnya ke nol. (Ini pada dasarnya adalah epsilon, yang biasa digunakan dalam membandingkan pelampung)
Gunakan gesekan, redaman, dan tumbukan tidak elastis untuk menyerap energi dari sistem dan membantunya mencapai istirahat lebih cepat secara keseluruhan.
Tingkatkan gesekan / redaman / inelastisitas secara selektif untuk objek yang bergerak lambat untuk memberi mereka dorongan terakhir untuk beristirahat, tanpa memengaruhi perilaku tubuh yang lebih berenergi.
sumber