Saya sedang menulis mesin fisika 2d dalam javascript sehingga saya dapat mempelajari lebih lanjut tentang fisika dalam permainan video. Saya memilikinya bekerja dengan benar untuk tumbukan benda tegar, kecuali jika ada benda yang bertabrakan dengan dua atau lebih benda lainnya secara bersamaan.
Saat ini untuk setiap pasangan benda bertabrakan (A, B) Saya memodifikasi kecepatan dan kecepatan sudut mereka berdasarkan pada dorongan tabrakan, dan mendorong mereka keluar satu sama lain sehingga mereka tidak menembus. Tapi kemudian deteksi tabrakan dan perhitungan impuls untuk tabrakan lain yang melibatkan A akan salah.
Pendekatan apa yang bisa saya jelajahi agar mesin saya berfungsi untuk 3+ objek yang saling bertabrakan?
Jawaban:
Saya menggunakan pendekatan berikut (mirip dengan algoritma pemisahan massa Tongrich http://www.richardtonge.com/ ):
m_A/M
dan dari B kem_B/N
m_A = m_A * M
danm_B = m_B * N
)Pendekatan ini mirip dengan bagaimana algoritma iteratif Jacobi bekerja dengan sistem persamaan simultan linier. Dan itu tidak dijamin untuk menyatu, tetapi dalam simulator saya itu melakukan pekerjaan dengan cukup lancar .. dalam 3D (ya, dimensi tambahan menambah dua kali kesulitan!).
Peringatan : posisi dan kecepatan yang benar hanya setelah fase deteksi / penanganan tubrukan Anda selesai! Dengan begitu, Anda secara bersamaan memperbarui aktor yang bertabrakan. Juga, pasukan restitusi harus diperhitungkan pada saat Anda mengintegrasikan posisi dan kecepatan.
EDIT: Ya, saya kira Anda menggunakan metode integrasi Verlet yang sudah disalahgunakan (yang ini menjadi nama rumah tangga di kalangan penggemar gamedev). Dalam momok penanganan tabrakan dan integrasi ini, Anda mungkin ingin melihatnya di sini .
UPDATE: Beberapa informasi tentang cara mendekati tabrakan (dan tabrakan diri untuk fakta itu) dapat ditemukan dalam makalah ini:
Makalah yang agak sederhana tentang resolusi tabrakan tubuh yang kaku melalui metode berbasis impuls: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Batang Elastis Tanpaexteksensi dengan Gesekan Torsi berdasarkan Pengganda Lagrange
Pendekatan yang saya usulkan bukan dengan kontribusi besar, banyak game menggunakannya dengan hasil yang masuk akal dan itu paling baik digunakan oleh Jakobsen dalam mesin permainan Hitman-nya.
Dari pengalaman yang agak praktis, kekuatan penalti (mirip dengan pegas linier atau eksponensial yang mendapatkan input dari jarak penetrasi) tidak dengan baik menyelesaikan penetrasi ketika kekuatan lain dari tubuh yang bertabrakan berhasil menjadi lebih besar dari mereka. Itu sebabnya saya memilih untuk menggabungkan tiga pendekatan (hampir redundan): gaya reaksi Newton (Anda mendorong dinding, dinding mendorong kembali), kecepatan turunan impuls (bola snooker bertabrakan) dan non-alami "memindahkan tubuh saling menjauh secara geometris "solusi. Bersama-sama mereka tampaknya menyediakan segalanya: singkirkan sebagian besarartefak interpenetrasi yang jelek, tubuh yang bertabrakan cenderung berinteraksi satu sama lain dalam jangka panjang (karena kecepatan dan kekuatan restitusi - setidaknya kekuatan yang cenderung menyeret tubuh dalam skenario tabrakan dibatalkan dan tubuh terpental satu sama lain) . Terakhir, untuk lebih memahami konsep-konsep sederhana namun umum ini, saya sarankan untuk menganalisis slide-slide ini .
Julukan "metode yang disalahgunakan" saya yang menggambarkan langkah-langkah integrasi Verlet ditargetkan pada kepercayaan budaya populer bahwa ini adalah Cawan Suci metode integrasi. Ini sedikit lebih baik dari pada sepupu Euler Symplectic (juga disebut oleh beberapa Euler semi-implisit). Cara metode integrasi yang lebih rumit ada (dan semua menanggung nama implisit di dalamnya). Mesin permainan yang kuat memanfaatkannya, tetapi pengembang indie tidak punya waktu untuk bereksperimen dengan mereka sejak Verlet, ketika disetel ke skenario tertentu, benar-benar menakjubkan. Juga, sama sekali tidak ada metode integrasi yang dapat menangani kendala kaku tanpa sedikit pun kecurangan yang terlibat (tidak dapat menemukan tautan, tetapi makalah yang saya maksudkan harus disebut "X.Provot -" Kendala Deformasi dalam Massa Model Musim Semi untuk Menjelaskan Perilaku Kain Yang Kaku "
sumber
Saya menyarankan agar, alih-alih mengubah kecepatan, Anda mengubah gaya yang bekerja pada suatu objek. Jangan "sikut" keluar, lakukan dengan lancar dan gunakan kode yang sudah ada. Dengan melakukan ini, tubuh tidak akan segera (dan dengan cepat, saya kira) mengubah kecepatan mereka.
Lihat Box2DJS untuk contoh: http://box2d-js.sourceforge.net/index2.html .
sumber
Saya secara analitis memecahkan persamaan impuls untuk kelompok tubuh yang bertabrakan. Satu-satunya masalah yang saya hadapi adalah kurangnya variabel untuk menemukan kekuatan interaksi relatif di antara kontak dalam suatu kelompok, yang saya isi dengan kedalaman persimpangan tubuh.
Solusi untuk kontak grup tidak lebih sulit daripada kontak tunggal. Sayangnya saya kehilangan kertas dengan perhitungan, sehingga tidak dapat membagikannya di sini.
Sunting: Mungkin saya datang dengan sesuatu seperti ini /physics/296767/multiple-colliding-balls
sumber