Resolusi tabrakan dalam kasus tabrakan dengan beberapa objek

15

Saya memiliki objek statis dan objek bergerak. Tabrakan dideteksi menggunakan teorema sumbu-pisah.

Misalnya, dalam situasi ini saya memiliki dua objek statis (merah):

masukkan deskripsi gambar di sini

dan objek bergerak antara keduanya:

masukkan deskripsi gambar di sini

Algoritme saya dapat menghitung tumbukan antara dua objek ini, dan juga memuntahkan vektor resolusi sempurna (berarti vektor perpindahan minimum) ke tumbukan.

Jadi misalnya, ketika saya memeriksa tabrakan antara persegi panjang hijau dan persegi panjang merah kanan, algoritma meludahkan vektor yang memberitahu saya bagaimana saya perlu memindahkan persegi panjang hijau untuk menyelesaikan tabrakan:

masukkan deskripsi gambar di sini

Perhatikan bahwa saya hanya dengan cepat menggambar ini di MSPaint, jadi dalam gambar itu sebenarnya bisa jadi vektor terjemahan minimum mendorong persegi panjang hijau di atas, tapi saya akan menganggap di sini bahwa mendorongnya ke kiri / benar sebenarnya lebih pendek.

Cara umum untuk mendekati ini adalah dengan hanya menyelesaikan tabrakan satu tabrakan per frame, bukan sekaligus. Tetapi dalam kasus saya, ini akan menghasilkan flip-flopping:

Pertama, pemecah mendeteksi dua tabrakan tetapi hanya menyelesaikan tabrakan antara persegi panjang kanan dan persegi panjang hijau:

masukkan deskripsi gambar di sini

Kemudian, dalam bingkai berikutnya, ia mendeteksi hanya satu tabrakan yang berada di antara persegi panjang merah kiri dan persegi panjang hijau, dan menyelesaikannya:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, ini sebenarnya tidak menyelesaikan tabrakan (misalnya dengan mendorong persegi panjang hijau ke atas), dan sebagai gantinya hanya membalik jepit di antara kedua negara secara tak terbatas.

Bagaimana saya bisa memecahkan masalah ini?

TravisG
sumber
Anda menggunakan persegi panjang dalam contoh Anda. Apakah algoritma tabrakan Anda hanya menyelesaikan tabrakan hanya pada satu sumbu? Jika demikian, masuk akal bahwa perilaku yang Anda gambarkan sedang terjadi.
chaosTechnician
Tidak, itu dapat menyelesaikannya dengan segala bentuk pada semua sumbu yang mungkin (bukan hanya persegi panjang, mereka hanya yang paling mudah untuk menggambar dengan cat MS: P) dan itu akan selalu menemukan vektor terpendek yang ada yang mendorong kedua objek terpisah .
TravisG
+1 pertanyaan bagus. Saya menghapus "tag" (2D) dari judul, itu adalah sesuatu yang harus Anda hindari (lihat meta ).
bummzack

Jawaban:

7

Bergantung pada apa yang ingin Anda capai (akurasi fisik tinggi atau hanya simulasi waktu nyata yang cukup dekat), Anda dapat mencoba menggunakan kontak spekulatif.

Berikut detailnya: http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/

Dia menjelaskan dalam artikel itu apa yang perlu Anda ketahui untuk mengimplementasikannya, dan itu sangat sederhana dibandingkan dengan pendekatan lain (seperti casting bola dan kemudian menyortir resolusi tabrakan berdasarkan waktu dampak).

Jika Anda membutuhkan / menginginkan lebih, Anda dapat membeli kode sumbernya untuk (IIRC) $ 7.

Ini adalah video implementasi saya dalam 3D: http://www.youtube.com/watch?v=JvT2H1RmOas

Perhatikan seberapa stabil simulasi hanya dengan satu iterasi. Anda dapat dengan mudah menggunakan beberapa iterasi per bingkai untuk menyelesaikan banyak tabrakan ke kondisi stabil, yang akan lebih akurat.

Olhovsky
sumber
2

Pertama-tama Anda dapat menghitung semua vektor yang diperlukan untuk menyelesaikan setiap tabrakan kemudian menghitung hasil dari mereka.

Satu-satunya kasus ketika ini dapat byte Anda adalah jika vektor-vektor ini saling meniadakan, seperti pada contoh Anda. Dalam hal ini tabrakan tidak dapat diselesaikan.

Mihai Maruseac
sumber
Tambahkan vektor acak kecil dengan besarnya sekitar epsilon * 10 ke tabrakan? Aritmatika titik mengambang harus melakukan sisanya.
Martin Sojka
2
Ya, ini bisa berhasil, saya kira. Tapi itu juga bisa membuat gerakan jittering.
Mihai Maruseac
1
Saya harap saya masih bisa mendapatkan jawaban tentang ini: menghitung hasil resultan memperbaiki masalah "loop tak terbatas", tetapi memperkenalkan kembali masalah "retak", di mana bergerak sambil meluncur di dinding yang terbuat dari ubin dengan ukuran yang sama membuat tubuh mendapatkan terjebak di antara "celah" ubin. Apakah ada cara untuk menyelesaikan kedua masalah ini?
Vittorio Romeo
Setuju ... tidak ada "jawaban benar" terbaik untuk menyelesaikan tabrakan tubuh kaku yang mustahil seperti itu. Entah itu gelisah, atau Anda membiarkan "bubur" dalam satu atau lebih objek.
david van
0

Jika Anda melihatnya dari dekat, keadaan objek itu (atau seharusnya) tidak dapat diraih ..

Biarkan bentuk merah paling kiri menjadi bentuk R1, dan bentuk merah paling kanan adalah bentuk R2. Biarkan bentuk hijau menjadi G.

yaitu Mengingat ukuran dan geometri dari ketiga objek, dan mengingat bahwa semua objek tidak dapat ditembus:

 (1) G could not have been just directly to the left of R2, since R1 has been there 
     already. Consequently, the translation of G from left to right, penetrating R2
     could not have occurred.
 (2) G could not have been just directly to the right of R1 since R2 has been there 
     already. Consquence of which is the same as that from (1).
 (3) Had G come from the top, the movement will be blocked by both R1 and R2, given
     that their geometry and Y coordinate is the same.

Sekarang, intinya, jika algoritma Anda menanyakan objek Anda satu per satu, maka itu adalah masalah konkurensi, yaitu dalam arti tertentu, algoritma tersebut seharusnya memeriksa SEMUA objek pada saat yang sama, tetapi algoritma membatasi Anda untuk melakukan objek dan memprosesnya satu per satu ...

Jika G diperiksa terhadap R1 setelah diperiksa terhadap R2, maka G akan tampak secara hukum berada di sebelah kanan R1 (jika G mengatakan mendekati R1 dengan arah vektor <-1, -1> dengan magnitudo acak (atau jarak) ), karena pemeriksaan antara R1 dan G mengijinkannya, dan lupa tentang pemeriksaan antara R2 dan G yang dilakukan sebelumnya.

Solusi yang dapat Anda lakukan adalah mengumpulkan semua vektor perpindahan minimum ke dalam array atau struktur data apa pun yang Anda inginkan, dan memilih satu yang terbukti sah untuk SEMUA Objek.

Perhatikan bahwa pada frame yang diberikan, objek (G misalnya) hanya dapat memiliki SATU arah. (oh man, terdengar seperti boyband ...)

Liu Mao Hsing
sumber