Apa cara terbaik untuk menangani tabrakan simultan di mesin fisika?

13

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?

Cam
sumber
2
Terkait: gamedev.stackexchange.com/questions/15836/… dan gamedev.stackexchange.com/questions/26181/… dan saya yakin masih ada lagi, saya tidak bisa menemukan yang sekarang.
MichaelHouse

Jawaban:

11

Saya menggunakan pendekatan berikut (mirip dengan algoritma pemisahan massa Tongrich http://www.richardtonge.com/ ):

  • mendeteksi semua pasangan yang bertabrakan dalam adegan / konteks Anda. Biarkan (A, B) menjadi pasangan seperti itu. Terapkan gagasan pemisahan hantu / massa: jika A bersentuhan dengan benda M dan B bersentuhan dengan benda lain N, maka tentukan sementara massa A ke m_A/Mdan dari B kem_B/N
  • menghitung kontribusi kekuatan reaksi / restitusi untuk setiap pasangan (A, B) dan menyimpan kontribusi ini dalam akumulator A dan B sendiri
  • menghitung kecepatan restitusi dari impuls (seperti yang Anda sebutkan) dan menyimpannya dengan cara yang sama (seperti residu kecepatan deltaV dalam akumulator masing-masing untuk setiap pasangan (A, B))
  • menghitung pemindahan penalti (sekali lagi, menumpuk perpindahan, jangan langsung menerapkannya!)
    • mengatur ulang massa semua badan yang sebelumnya ditetapkan sebagai pihak dalam pasangan tabrakan ( m_A = m_A * Mdan m_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:

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 "

teko teh
sumber
Terima kasih (+1)! Apa itu 'kecepatan ganti rugi' dan 'pemindahan penalti'? Juga, mengapa Anda mengatakan bahwa integrasi verlet 'disalahgunakan'? Apakah Anda pikir ini metode yang buruk untuk digunakan?
Cam
Kecepatan penggantian adalah kecepatan yang Anda dapatkan dari impuls, satu-satunya perbedaan adalah bahwa saya menghitungnya sebagai residu (yaitu saya menyimpan perbedaan antara kecepatan berdasarkan impuls dan kecepatan saat ini sambil menjaga kecepatan saat ini tidak tersentuh untuk perhitungan lebih lanjut). Pemindahan hukuman adalah vektor dengan panjang yang ditentukan oleh seberapa banyak dua objek saling menembus dan itu adalah vektor panjang minimal yang dapat menerjemahkan satu objek sepenuhnya di luar yang lain. Saya biasanya menambahkan perpindahan seperti itu ke setiap objek yang membagi panjangnya dengan 2).
teodron
1
Jawaban yang brilian! Saya punya pertanyaan lain. Katakanlah saya mengakumulasi kecepatan restitusi, bukankah mereka akan bertambah menjadi angka yang sangat tidak realistis? Jika saya memperlakukan setiap tabrakan dengan objek A secara terpisah dan hanya menambahkan efek pada setiap objek tidak akankah A tidak memiliki impuls menyebar di antara objek? Sebaliknya impuls penuh akan diterapkan pada masing-masing yang tampaknya salah bagi saya secara intuitif
Cam
Itu pertanyaan yang sangat bagus .. dari satu sudut pandang, tampaknya masuk akal jika impuls berkontribusi secara positif pada kecepatan yang dihasilkan. Inilah alasan saya (mungkin salah!): Bayangkan tiga bola pool / snooker bertabrakan. Salah satunya harus menerima kontribusi dari dua lainnya dengan cara tambahan ini. Awalnya, saya berpikir untuk menimbang kontribusi ini dan menghitung rata-rata tertimbang untuk kecepatan akhir, tetapi karena saya ingin hasil yang cepat, saya melewatkan ide ini. Secara keseluruhan, bola yang bertabrakan harus mendapatkan kontribusi kecepatan dari dua yang tersisa. Mungkin buku teks sekolah menengah bisa membantu.
teodron
3
Mungkin saya tidak mengerti apa yang telah Anda jelaskan, karena contoh berikut masih mengkhawatirkan saya: Pertimbangkan persegi panjang horizontal jatuh lurus ke bawah, dan anggaplah lantai bergerigi (jadi terdiri dari beberapa segitiga berdampingan). Jika ada n segitiga, menggunakan metode akumulatif Anda, persegi panjang akan memantul kembali pada n kali kecepatan seharusnya! Bagaimana situasi itu bisa diperbaiki?
Cam
1

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 .

jcora
sumber
-1

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

George Vinokhodov
sumber