Bagaimana seseorang melakukan deteksi tabrakan pada objek yang terbuat dari banyak segitiga kecil?


13

Saya mengerti bahwa segala bentuk dapat dibuat (atau diperkirakan) oleh segitiga yang lebih kecil. Setiap persegi panjang dapat dibuat oleh 2 segitiga kecil. Setiap lingkaran dapat dibuat dengan banyak segitiga "irisan pizza" tipis. Bagaimana ini diterjemahkan ke deteksi tabrakan?

Saya mengerti cara menghitung tumpang tindih persegi panjang menggunakan simpul. Saya mengerti cara menghitung lingkaran tumpang tindih menggunakan pusat, jari-jari, dan jarak.

Tapi, bagaimana seseorang melakukan deteksi tabrakan pada bentuk yang terbuat dari segitiga kecil? Tidak spesifik, tetapi hanya konsep umum ....

Jawaban:


26

Tapi, bagaimana seseorang melakukan deteksi tabrakan pada bentuk yang terbuat dari segitiga kecil?

Dengan tidak melakukannya.

Deteksi tabrakan terhadap koleksi segitiga arbitrer (atau lebih buruk, antara dua koleksi segitiga sewenang-wenang) sangat mahal.

Sebagai gantinya, kami biasanya melakukan pendeteksian koleksi secara hierarkis, dimulai pertama dengan bentuk yang sangat kasar dan sederhana (seperti kotak atau bola) yang mendekati (buruk) objek yang mendasarinya.

Ini memungkinkan kita untuk dengan cepat menolak mayoritas tabrakan potensial sebagai "tidak terjadi," yang merupakan kasus biasa. Dalam kasus di mana cek mentah semacam itu lewat, yang menunjukkan potensi tabrakan aktual, dan kami melanjutkan untuk melakukan pemeriksaan terhadap perkiraan yang lebih rinci dari bentuk yang mendasarinya (seperti yang dibuat dari beberapa bentuk kapsul yang dipasang dengan ketat, atau banyak kotak pembatas selaras).

Pada dasarnya, deteksi tabrakan dimulai dengan tes kasar dan, ketika tes-tes tersebut berlalu, berlanjut ke representasi yang semakin rinci. Gambar ini, disediakan oleh Shiro dalam komentar atas jawaban Alexandre , menggambarkan bagaimana model yang kompleks (manusia) dapat diwakili oleh serangkaian bentuk yang lebih sederhana:

hitbox

Jarang sekali kita benar - benar perlu melakukan tabrakan pada tingkat segitiga individu, dan ketika kita melakukannya kita biasanya menggunakan metode yang lebih kasar untuk menyibak satu set segitiga potensial yang sangat kecil untuk diuji. Pada titik itu, algoritma spesifik digunakan untuk melakukan tes, sama seperti Anda akan menguji apakah dua persegi panjang tumpang tindih. Misalnya, Anda dapat menentukan apakah dan di mana sinar menyentuh segitiga .


Terima kasih. Ya, jika saya benar-benar membuat game, saya hanya akan menggunakan mesin yang ada. Tapi, saya hanya ingin memahami ide-ide dasar yang diimplementasikan dalam mesin pendeteksi tabrakan yang dibuat sebelumnya. Dalam diagram Anda di atas, Anda akan menggunakan matematika persegi panjang untuk melihat apakah ada yang menyentuh SETIAP dari puluhan persegi panjang yang membentuk pria itu. Apakah itu ide dasarnya?
JackOfAll

Mereka berorientasi kotak pembatas (3D) bukan persegi panjang. Tapi ya. Jika saya akan menguji apakah sinar (mewakili, katakanlah, peluru) bertabrakan dengan pemain saya akan menguji sinar terhadap kotak-kotak - mungkin setelah pengujian pertama terhadap satu kotak raksasa yang mewakili seluruh karakter - tidak terhadap setiap segitiga dari render mesh).

Idenya adalah bahwa Anda dapat menggunakan perkiraan kasar karakter, seperti kotak pembatas berorientasi yang ditunjukkan pada gambar di atas, dan menguji yang pertama untuk melakukan tes hit yang lebih murah, dan jika ada tabrakan kemudian menelusuri ke tingkat yang lebih rendah JIKA PERLU, menguji masing-masing segitiga yang terkandung dengan kotak pembatas. Biasanya ada beberapa BV berbeda yang digunakan secara hierarkis, dengan yang luar kurang akurat tetapi tercepat untuk diuji (bola, kotak pembatas), dan menelusuri ke sesuatu yang lebih spesifik (k-DOP), dan berpotensi menelusuri lebih jauh lagi (segitiga) )
Kik

4

Deteksi tabrakan didasarkan pada geometri (primitif seperti garis, pesawat, bola, kotak, kapsul, silinder).

Jika Anda perlu melakukan deteksi tabrakan pada bentuk yang terbuat dari segitiga, misalnya medan yang tidak rata, Anda harus menguji terhadap semua segitiga yang membentuk jala.

Jika Anda sampai pada titik itu, saya akan sangat menyarankan untuk menggunakan mesin pendeteksi tabrakan pra-dibuat, karena hal-hal semacam ini menjadi sangat kompleks, cukup cepat.


Bagaimana Anda melakukan deteksi tabrakan pada bentuk yang terbuat dari segitiga?
JackOfAll

@JackOfAll dia sudah menyebutkan bahwa dalam balasannya, itu adalah dengan menggunakan bentuk geometri biasanya i.stack.imgur.com/CAhxn.jpg
dimitris93

@JackOfAll saya mengedit jawaban saya; dan seperti yang dikatakan Shiro, jika Anda memiliki "item" yang lebih kompleks di lingkungan Anda (tubuh, kursi, mobil, dll ...), dalam pengembangan game mereka biasanya terbuat dari primitif sederhana yang diikat bersama. Deteksi tabrakan dibuat pada bentuk primitif, tetapi simulasi fisika kemudian dilakukan pada seluruh tubuh.
Vaillancourt

4
Saya tidak benar-benar mencoba membuat game, saya hanya ingin memahami ide-ide dasar yang diimplementasikan dalam mesin pendeteksi benturan yang dibuat sebelumnya. Jika saya benar-benar membuat permainan, saya jelas tidak akan menemukan kembali kemudi, setuju.
JackOfAll
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.