Resolusi Tabrakan

23

Saya tahu benar cara memeriksa tabrakan, tetapi saya tidak tahu cara menangani tabrakan dengan cara yang baik.

Sederhana, jika dua benda bertabrakan, saya menggunakan beberapa perhitungan untuk mengubah arah kecepatan. Jika saya tidak memindahkan dua objek, mereka masih akan tumpang tindih dan jika kecepatannya tidak cukup besar mereka masih akan bertabrakan setelah pembaruan berikutnya. Hal ini dapat menyebabkan benda saling macet.

Tetapi bagaimana jika saya mencoba memindahkan kedua benda tersebut agar tidak tumpang tindih. Ini kedengarannya ide yang bagus tetapi saya menyadari bahwa jika ada lebih dari dua objek ini menjadi sangat rumit. Bagaimana jika saya memindahkan dua benda dan salah satunya bertabrakan dengan benda lain jadi saya harus memindahkannya juga dan mereka mungkin bertabrakan dengan dinding dll.

Saya memiliki permainan 2D top-down dalam pikiran tetapi saya tidak berpikir itu banyak hubungannya dengan itu. Bagaimana biasanya tabrakan ditangani?

Pertanyaan ini diajukan atas nama Wooh

CiscoIPPhone
sumber
1
Bisakah Anda menjelaskan jenis permainannya? "Top down 2D" bisa berarti banyak hal: game aksi-petualangan gaya Zelda, penembak gulir vertikal, atau permainan biliar saku. Semua ini akan memiliki gaya standar penanganan benturan yang sangat berbeda!
Ian Schreiber
2
Saya tidak bisa mengklarifikasi itu. Pertanyaannya bukan tentang apa yang akan terjadi sebagai akibat dari tabrakan, ini tentang menangani masalah multiple overlap. Saya pikir itu cukup untuk mengetahui saya memantulkan objek satu sama lain dan saya ingin mereka berperilaku realistis untuk menjawab pertanyaan ini.
CiscoIPPhone

Jawaban:

16

Daniel Kodicek membahas topik ini dengan sangat rinci dalam bukunya, Matematika & Fisika untuk Programer .

Kodicek melakukan dua hal untuk mencapai resolusi tabrakan yang terlihat alami:

  • Fungsi deteksi tabrakannya menghitung waktu yang tepat dua benda akan bertabrakan.
  • Dia menghitung ulang kecepatan baru pada saat tabrakan, sehingga objek tidak pernah tumpang tindih.

Saya mengunggah demo berdasarkan deteksi dan resolusi tabrakan Kodicek .

pembaruan: Berikut ini adalah algoritme deteksi & resolusi tabrakan yang sangat mirip dengan metode Kodicek. Dengan kode sumber . Saya masih merekomendasikan buku Kodicek, karena algoritmanya diimplementasikan sedikit berbeda dan jauh lebih dijelaskan.

Leftium
sumber
1
Tautan demo Anda tampaknya rusak.
ashes999
@ ashes999: tautan diperbaiki sekarang!
Leftium
Ini adalah algoritma untuk lingkaran. Bagaimana dengan kotak?
Anton Chikin
@AntonChikin: Algoritma resolusi tumbukan Kodicek hanya membutuhkan tiga input: massa, kecepatan, dan normal pada titik tumbukan. Kodicek selalu menghitung normal pada titik tabrakan saat mendeteksi tabrakan. Dia menjelaskan berbagai jenis deteksi tabrakan, termasuk kotak yang mengenai kotak lain. Cukup masukkan algoritma pendeteksian tabrakan ke dalam algoritma resolusi tabrakan. Lihat bab 8-10 buku Kodicek untuk penjelasan lengkap. (Perhatikan fisika rotasi memerlukan lebih banyak matematika, yang juga dibahas nanti dalam buku ini ...)
Leftium
1
@ThomasHilbert: kode sumber demo dan file executable Windows sekarang tersedia di leftium.com/asteroid
Leftium
6

Bagaimana jika Anda memeriksa tabrakan sebelum benda bergerak, bukan sesudahnya? Atau, dengan kata lain, Anda menolak posisi baru jika benda bertabrakan, menggunakan kembali yang lama dalam kasus itu?

Kodesemu:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

Dengan cara ini objek akan bertabrakan satu sama lain ketika mereka akan bertabrakan , jika langkah pembaruan Anda cukup kecil pemain tidak akan melihat sesuatu yang aneh dalam representasi.

CeeJay
sumber
1
Ini cukup menjengkelkan, karena Anda tidak dapat dengan mudah bergerak sejajar dengan objek karena Anda tidak dapat bergerak di al jika Anda menyentuh objek lain.
Ikke
Kecuali jika Anda menyelesaikan x dan y secara terpisah
instantaphex
6

Setiap kali dua objek tumpang tindih, periksa apakah mereka bergerak ke arah atau menjauh dari satu sama lain. Lakukan tabrakan hanya jika mereka bergerak ke arah satu sama lain.

Cukup mudah dengan matematika vektor, cukup hitung:

dot_product (B.position - A.position, A.velocity - B.velocity)

Jika hasilnya positif, objek bergerak ke arah satu sama lain.

aaaaaaaaaaaa
sumber
4

Saya bisa saja salah paham, tetapi sepertinya Anda mengajukan dua pertanyaan: 1. apa beberapa cara umum untuk menangani resolusi tabrakan istilah yang Anda cari adalah 'simulasi berbasis impuls', dan ada banyak makalah yang bisa melakukannya keadilan yang lebih baik daripada yang saya bisa.

Singkatnya Anda ingin euler langkah simulasi fisika Anda di ruang momentum, yang kecepatan massa kali (jangan melakukan hal-hal berdasarkan kekuatan, integrator Anda tidak melakukannya dengan benar).

Untuk respon sudut, untungnya momen inersia terbesar dan paling kecil dapat selalu direduksi menjadi dua sumbu ortogonal (dalam 2D), yang berarti matriks berlipat akan bekerja secara umum, dan jika Anda mengaitkannya dengan sumbu X dan Y, itu berubah menjadi vektor 2D.

Ketika Anda memiliki tabrakan, Anda mencari tahu respons berdasarkan momen linear dan sudut pada titik tabrakan, dan faktor fudge yang baik adalah, jika Anda memiliki interpenetrasi, untuk menerapkan beberapa kekuatan penalti (seperti yang disebutkan di atas) untuk memisahkan kedua badan.

Dari titik ini Anda akan berakhir menambahkan semakin banyak aturan untuk mengendalikan perilaku menyimpang, seperti membatasi momentum sudut maksimum sehingga hal-hal tidak berputar seperti gasing, dll., Tetapi ini adalah awal yang baik.

Sederhanakan jika Anda bisa.

  1. Bagaimana Anda mengatasi masalah tabrakan multi-tubuh

Satu-satunya cara nyata untuk melakukan ini adalah dengan sistem persamaan linear dan banyak pemecahan. Cara praktis untuk melakukannya adalah memiliki sistem seperti yang di atas, dan memiliki fisika secara alami menyelesaikan dari waktu ke waktu.

Sebagian besar gim yang melakukan hal-hal seperti menggulung, atau berdiri di atas permukaan yang bergerak, memiliki model hibrida di mana kaki Anda melekat pada permukaan (atau roda ke jalan) untuk mengakomodasi loncatan waktu fisika (yang akan menghasilkan siklus respons antarpenetrasi dan tidak akan bekerja).

Semoga ini membantu. Jika Anda membutuhkan contoh matematika, beri tahu saya.

Aaron Brady
sumber
3

Cara ini biasanya diselesaikan dalam mesin fisika adalah dengan menerapkan kekuatan penalti. Memindahkan tubuh kaku setelah antar-penetrasi tidak akan terlihat bagus jika tubuh kaku Anda bergerak dengan kecepatan lebih tinggi (Anda akan melihat gerakan menyentak sesaat), meskipun sebagai langkah pertama, Anda harus mencobanya dan melihat apakah itu sesuai dengan kebutuhan Anda.

A penalty forcediterapkan seperti peredam pegas, di mana gaya pinalti meningkat, semakin banyak Anda melakukan inter-penetrasi pada benda tegar dan berkurang pada bingkai berikutnya. Anggap saja sebagai mata air. Ketika dua benda kaku saling menembus, mereka masing-masing menghadapi pegas tak terlihat yang menghambat perkembangan mereka (yaitu, mencegah lebih banyak antar-penetrasi) dan menerapkan yang disebutkan sebelumnya penalty forcesampai tubuh tidak lagi menembus.

Ini adalah topik yang luas tetapi mudah-mudahan informasi di atas akan membantu Anda memulai.

Samaursa
sumber
Jadi alih-alih mencegah inter-penetrasi, metode ini memungkinkannya tetapi memberikan perlawanan, hampir seperti benda yang dikompresi?
CiscoIPPhone
Ini memberikan perlawanan, ya, perlawanan meningkat semakin banyak yang coba ditembus tubuh. Dalam praktiknya, jika Anda memiliki waktu delta yang cukup rendah (misalnya 10 ms), itu tidak akan menghasilkan inter-penetrasi. Namun, keuntungan sebenarnya dari metode ini adalah ketika Anda memiliki tubuh yang telah saling menembus karena berbagai alasan (posisi diubah, mereka adalah jaringan tubuh yang kaku dan posisinya dikoreksi) dan sekarang perlu dipisahkan, karena tanpa teknik ini tubuh tersebut akan meledak daripada terpisah secara bertahap.
Samaursa