Teorema Pemisah Sumbu (SAT) memudahkan untuk menentukan Vektor Terjemahan Minimum, yaitu vektor terpendek yang dapat memisahkan dua objek bertabrakan. Namun, yang saya butuhkan adalah vektor yang memisahkan objek di sepanjang vektor yang bergerak menembus objek (yaitu titik kontak).
Saya membuat gambar untuk membantu memperjelas. Ada satu kotak, bergerak dari posisi sebelumnya ke posisi berikutnya. Dalam posisi setelahnya, memotong poligon abu-abu. SAT dapat dengan mudah mengembalikan MTV, yang merupakan vektor merah. Saya mencari untuk menghitung vektor biru.
Solusi saya saat ini melakukan pencarian biner antara posisi sebelum dan sesudah sampai panjang vektor biru diketahui sampai batas tertentu. Ini bekerja tetapi ini merupakan perhitungan yang sangat mahal karena tabrakan antara bentuk harus dihitung ulang setiap loop.
Apakah ada cara yang lebih sederhana dan / atau lebih efisien untuk menemukan vektor titik kontak?
Jawaban:
Apa yang Anda bicarakan cukup sulit jika Anda menyusunnya sebagai pertama memindahkan objek, kemudian menguji tabrakan, lalu mundur sampai Anda keluar dari objek. Mungkin lebih baik untuk menganggap ini sebagai tes persimpangan dinamis : objek bergerak melawan objek stasioner.
Untungnya, memisahkan pengujian poros dapat membantu Anda di sini! Berikut deskripsi algoritma, milik Ron Levine :
Dengan kata lain, Anda mengulangi semua sumbu yang biasanya Anda lakukan dalam tes sumbu pemisah statis. Alih-alih keluar-awal jika Anda tidak menemukan tumpang tindih, Anda terus berjalan dan memeriksa kecepatan yang diproyeksikan dari objek bergerak. Jika itu menjauh dari objek statis, maka Anda lebih awal. Jika tidak, Anda dapat memecahkan untuk waktu kontak paling awal dan terbaru cukup mudah (itu satu interval 1D bergerak menuju interval 1D lainnya). Jika Anda melakukan itu untuk semua sumbu dan menjaga maksimum waktu persimpangan paling awal dan minimum waktu persimpangan terbaru, maka Anda tahu apakah objek bergerak Anda akan mengenai objek statis, serta kapan. Jadi, Anda dapat memajukan objek bergerak hingga titik yang akan mengenai objek statis.
Berikut ini beberapa pseudocode kasar dan sepenuhnya tidak diverifikasi untuk algoritme:
Berikut ini adalah artikel Gamasutra yang membicarakan penerapan ini untuk beberapa tes primitif yang berbeda. Perhatikan bahwa seperti halnya SAT, ini membutuhkan objek cembung.
Juga, ini sedikit lebih rumit daripada tes sumbu pemisah sederhana. Pastikan Anda benar-benar membutuhkannya sebelum mencobanya. Sejumlah besar gim hanya mendorong benda-benda dari satu sama lain di sepanjang vektor terjemahan minimum, karena mereka tidak menembus sangat jauh satu sama lain pada bingkai tertentu dan itu cukup banyak tidak terlihat secara visual.
sumber
Anda ingin menggunakan kliping poligon. Ini paling baik dijelaskan dengan gambar, yang tidak saya miliki, tetapi orang ini melakukannya, jadi saya akan membiarkan dia menjelaskannya.
http://www.codezealot.org/archives/394
Manifold kontak akan mengembalikan titik pada salah satu objek yang "paling bertanggung jawab" untuk tabrakan, bukan titik tumbukan langsung. Namun, Anda tidak benar-benar membutuhkan titik tumbukan langsung. Anda cukup mendorong objek terpisah menggunakan kedalaman penetrasi dan normal yang sudah Anda miliki, dan menggunakan manifold kontak untuk menerapkan efek fisik lainnya (misalnya, buat kotak jatuh / gulung ke bawah lereng).
Perhatikan bahwa gambar Anda mengilustrasikan masalah kecil: titik pada vektor biru yang Anda minta tidak akan ditemukan dalam simulasi fisik apa pun, karena itu sebenarnya bukan tempat kotak akan mengenai. Kotak itu akan mengenai sudut kiri bawahnya di suatu tempat lebih jauh di lereng karena hanya sedikit sudut yang menembus.
Kedalaman penetrasi akan relatif kecil, dan hanya mendorong kotak keluar dari kemiringan sepanjang penetrasi normal akan menempatkan kotak cukup dekat ke posisi "benar" sehingga hampir tidak terlihat dalam praktek, terutama jika kotak akan memantul, jatuh , atau geser sesudahnya.
sumber
Proyeksikan vektor MAT ke vektor arah. Vektor yang dihasilkan dapat ditambahkan ke Direction Vector untuk mengkompensasi penetrasi. Proyeksikan dengan cara yang sama, seperti yang Anda lakukan pada Sumbu saat melakukan SAT. Ini mengatur Objek tepat pada posisi yang menyentuh objek lain. Tambahkan epsilon kecil untuk melawan masalah floating point.
sumber
Ada beberapa peringatan untuk jawaban saya, bahwa saya akan keluar dari jalan pertama: Ini hanya berurusan dengan kotak berlari yang tidak berputar. Diasumsikan bahwa Anda mencoba menangani masalah tunneling , yaitu masalah yang disebabkan oleh objek yang bergerak dengan kecepatan tinggi.
Setelah Anda mengidentifikasi MTV, Anda tahu tepi / permukaan normal yang perlu Anda uji. Anda juga tahu vektor kecepatan linier dari objek yang saling menembus.
Setelah Anda menetapkan bahwa di beberapa titik selama bingkai, terjadi persimpangan, Anda kemudian dapat melakukan operasi setengah langkah biner, berdasarkan titik awal berikut: Identifikasi titik yang pertama kali menembus selama bingkai:
Setelah Anda memiliki simpul diidentifikasi, setengah langkah biner menjadi jauh lebih murah:
Ini cukup akurat, tetapi hanya akan memberikan satu titik tumbukan, dalam satu kasus.
Masalahnya adalah, biasanya mungkin untuk mengetahui terlebih dahulu apakah suatu objek akan bergerak cukup cepat per frame untuk dapat terowongan seperti ini, jadi saran terbaik adalah mengidentifikasi simpul terkemuka sepanjang kecepatan dan melakukan tes sinar sepanjang vektor kecepatan. Dalam hal objek berputar, Anda harus melakukan semacam biner halfstep slerp untuk memastikan titik kontak yang benar.
Dalam kebanyakan kasus, meskipun demikian, dapat diasumsikan dengan aman bahwa sebagian besar objek dalam adegan Anda tidak akan bergerak cukup cepat untuk menembus sejauh itu dalam satu frame tunggal, sehingga tidak diperlukan setengah langkah, dan deteksi tabrakan diskrit akan cukup. Objek berkecepatan tinggi seperti peluru, yang bergerak terlalu cepat untuk dilihat, dapat ditelusuri untuk titik kontak.
Menariknya, metode setengah-setengah ini juga dapat memberi Anda (hampir) waktu yang tepat ketika objek terjadi selama bingkai:
Jika Anda melakukan semacam resolusi tabrakan fisika, Anda kemudian dapat memperbaiki posisi A dengan:
maka Anda dapat melakukan fisika Anda secara normal dari sana. Kelemahannya adalah jika objek bergerak cukup cepat, Anda akan melihatnya bergerak kembali bersama vektor kecepatannya.
sumber