Cara mengatasi penetrasi dua tubuh yang bertabrakan

9

Saya telah menerapkan mesin fisika game 3D sederhana. Saya sudah memiliki deteksi tabrakan yang layak, sekarang saya mencoba untuk mencari tahu bagian respons tabrakan. Saya menggunakan metode berbasis impuls untuk menghitung kecepatan pasca-tabrakan. Ini bekerja cukup baik, namun, itu tidak sepenuhnya mencegah tubuh untuk terus melakukan penetrasi. Jadi saya punya potongan kode tambahan untuk menyelesaikan penetrasi. Saat ini, saya hanya menggerakkan tubuh di sepanjang kontak normal dengan setengah kedalaman penetrasi - tubuh pertama ke arah kontak normal, tubuh kedua di arah yang berlawanan.

Ini ok sebagian besar waktu, tetapi ada beberapa efek yang tidak diinginkan. Sebagai contoh, bayangkan sebuah koridor sempit dan sebuah benda bergerak melewatinya. Jika objek menyentuh salah satu dinding koridor, resolusi penetrasi memindahkannya ke dinding yang berlawanan, kemudian di bingkai berikutnya kembali ke dinding pertama dan seterusnya. Efeknya adalah objek bergetar sangat cepat antara dinding yang tidak cantik.

Jadi pertanyaan saya adalah apakah ada cara yang lebih baik untuk menyelesaikan penetrasi? Mungkin tidak menggerakkan tubuh, hanya entah bagaimana menyesuaikan kecepatan mereka (di samping perhitungan impuls) sehingga mereka berhenti bergerak ke satu sama lain dan penetrasi menyelesaikan sendiri dalam beberapa frame berikutnya. Saya hanya menebak-nebak di sini. Ada ide?

adam
sumber

Jawaban:

3

Saat Anda mendeteksi tabrakan, tentukan pada waktu / titik mana tubuh pertama kali bertabrakan, dan perlakukan tabrakan pada titik ini. Anda mungkin masih memiliki sedikit penetrasi untuk diselesaikan pada saat ini, tetapi akan jauh lebih kecil dan [biasanya] tidak akan menghasilkan masalah osilasi yang Anda alami.

Katakanlah Anda memiliki langkah simulasi 100 ms dan dalam beberapa bingkai, Anda memiliki dua bola yang bertabrakan setengah jalan (50 ms) ke dalam bingkai. Pertama, Anda akan mendeteksi bahwa mereka bertabrakan pada titik mana pun dalam bingkai (yang saya percaya Anda sudah melakukannya dengan efektif). Mereka Anda akan menentukan pada titik apa selama bingkai mereka bertabrakan. Sekarang tangani tabrakan, termasuk 50ms pertama dari bingkai di mana mereka tidak bertabrakan. Anda sekarang akan memiliki kecepatan baru bola, dan Anda juga dapat mengambil langkah sekarang untuk memastikan bahwa mereka tidak menembus (ini harus sangat kecil karena "baru saja terjadi.") Akhirnya, Anda akan mensimulasikan 50-an berikutnya dari bingkai. Perhatikan bahwa selama periode ini, mungkin ada tabrakan lain dengan satu atau kedua bola ini.

notlesh
sumber
1
Jadi pada dasarnya Anda menyarankan untuk menerapkan deteksi tabrakan berkelanjutan dan kemudian menangani penetrasi masih meninggalkan cara yang sama seperti yang sudah saya lakukan, karena kemungkinan besar akan sangat kecil. Kurasa ini bisa berhasil. Sekarang saya hanya perlu mencari cara untuk membuat deteksi tabrakan saya terus menerus :)
adam
Tidak yakin apa yang Anda maksud dengan terus menerus. Sebenarnya, tidak ada yang berkelanjutan dalam simulasi fisika, karena semuanya selalu dipecah menjadi beberapa langkah diskrit ukuran. Mengambil langkah yang lebih kecil, yang pada dasarnya adalah apa yang saya sarankan, akan menghasilkan kesalahan yang jauh lebih kecil (dan lebih mudah untuk diperbaiki). Cara lain untuk berpikir tentang ini adalah bahwa ada hubungan langsung antara ukuran langkah dan kesalahan (seperti penetrasi). Jadi, ketika Anda mendeteksi kesalahan seperti itu, bagi menjadi langkah-langkah yang lebih kecil sampai kesalahan itu diperbaiki.
notlesh
Deteksi tabrakan berkelanjutan berarti bahwa alih-alih memeriksa persimpangan antara dua objek statis (masalah 3d), Anda memeriksa kontak dua objek bergerak (pada dasarnya, masalah 4d). Biasanya cukup untuk hanya mempertimbangkan kecepatan konstan, karena Anda dapat memperkirakan lintasan dengan kurva linier piecewise. Keuntungannya adalah jarak penetrasi akan selalu nol (atau mendekati, karena kesalahan pembulatan float). Saya pikir Anda membicarakan hal ini, tetapi mungkin saya salah menafsirkan jawaban Anda?
Adam
@ Madam Ya, itulah yang saya bicarakan.
not not
2

Lihat artikel ini - yang telah diposting di sini berkali-kali sebelumnya, cukup cari melalui tanya jawab yang dideteksi dengan tabrakan - ini menunjukkan kepada Anda bagaimana melakukan resolusi tabrakan "kontinu" yang dibicarakan stephelton:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

Pada dasarnya, Anda memecahkan beberapa persamaan kinematika dasar untuk titik waktu yang tepat ketika dua kotak pembatas Anda mulai berpotongan. Anda menyelesaikan tabrakan pada saat yang tepat, dan kemudian melanjutkan dengan sisa waktu dalam bingkai Anda. Anda mungkin harus mensimulasikan kembali apa yang terjadi setelah momen tabrakan, karena kecepatan / percepatan objek Anda akan berubah. Tapi bagaimanapun, ada titik awal Anda ... tepuk tangan!

Mediokritus
sumber
Terima kasih, periksa artikelnya. Masalahnya saya menggunakan representasi yang berbeda dari objek saya. Saya menggunakan polyhedra cembung dan menguji tabrakan menggunakan teorema sumbu pisah. Ini dapat diperluas untuk menangani benda yang bergerak dengan kecepatan linier konstan (yang saya tahu caranya), tetapi tidak tahu bagaimana menangani juga kecepatan sudut. Tetapi saya akan mengajukan pertanyaan terpisah jika saya memutuskan untuk pergi dengan cara ini.
Adam