Saya punya mesin fisika sederhana yang memecahkan tabrakan dengan hanya memperbaiki posisi tubuh yang tumpang tindih (hanya lingkaran untuk saat ini) secara langsung, sebagai lawan dari hanya mengubah kecepatan atau menerapkan impuls. Kecepatan hanya diubah setelah dampak diselesaikan, atau selama bagian integrasi.
Saya punya masalah bahwa dalam tumpukan objek, objek teratas menerapkan terlalu banyak tekanan (ini ada secara implisit, tidak ada pemodelan tekanan dalam algoritme) pada objek di bagian bawah tumpukan, yang mengakibatkan mereka terdorong masuk ke lantai, dll.
Saya ingin memperbaiki ini dengan mengurutkan objek berdasarkan koordinat y mereka, sehingga tabrakan diselesaikan dari bawah ke atas. Tapi sekarang, mesin menunjukkan perilaku popping aneh untuk objek yang seharusnya benar-benar diam (lihat gif)
Tanpa hanya memberi Anda kode sumber - apa ini?
sumber
Jawaban:
Salah satu solusi yang saya temukan ketika menggunakan koreksi posisi adalah memiliki beberapa iterasi dan memvariasikan kekuatan dengan setiap iterasi.
Jadi iterasi pertama memiliki kekuatan 1 / num_iterations dan yang terakhir memiliki kekuatan 1. Ini membuat simulasi saya lebih halus dan lebih stabil daripada hanya menggunakan jumlah iterasi yang sama dengan kekuatan tetap.
sumber
Masalah Anda terletak pada kenyataan bahwa Anda tidak memiliki kondisi "istirahat" untuk tubuh Anda. Setiap sistem fisika memiliki sejumlah energi, baik itu kinetik, termal, dan sebagainya. Pada kenyataannya, benda padat sedikit berubah bentuk, dan mengubah sebagian energi kinetik menjadi panas, meskipun sulit diukur. Perlu juga dicatat bahwa pada kenyataannya tidak ada benda yang benar-benar solid. Bahkan bahan padat, seperti berlian, memiliki ruang di antara atom-atom, memberikan ruang struktur atom untuk melenturkan, dan menyerap energi kinetik.
Untuk membuat ini relevan, benda istirahat berada dalam keadaan di mana satu-satunya kekuatan yang berlaku adalah "kekuatan normal", yang berarti, kekuatan yang mencegah benda mengambang melalui satu sama lain. Besarnya gaya normal itu, sebanding dengan kerapatan benda-benda, dan seberapa jauh mereka telah saling menembus.
Mesin fisika menyebut nilai ini "slop".
Begini caranya: Hitung kemiringan, dan perbaiki posisi benda, dan terapkan gaya normal, berdasarkan kecepatan relatif kedua benda. selama pembaruan tubuh itu sendiri, hitung energi kinetik dari masing-masing tubuh. Jika di bawah nilai minimum, maka tidurlah tubuh, sampai kekuatan yang cukup besar diterapkan padanya. (biasanya dua kali nilai minimum).
sumber
Mengapa tidak menambahkan permukaan "lengket" kepada mereka dan meminta mereka tetap pada posisi istirahat secara bertahap dan ketika benda lain menabraknya, ia memindahkan sejumlah energi ke dalamnya yang menyebabkannya bergerak tetapi permukaan lengket akan menyebabkannya kehilangan sebagian energi ini dan berhenti dalam posisi istirahat. gif sepertinya tidak memiliki gesekan untuk itu.
sumber