Saya memiliki objek statis dan objek bergerak. Tabrakan dideteksi menggunakan teorema sumbu-pisah.
Misalnya, dalam situasi ini saya memiliki dua objek statis (merah):
dan objek bergerak antara keduanya:
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:
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:
Kemudian, dalam bingkai berikutnya, ia mendeteksi hanya satu tabrakan yang berada di antara persegi panjang merah kiri dan persegi panjang hijau, dan menyelesaikannya:
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?
Jawaban:
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.
sumber
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.
sumber
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:
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 ...)
sumber