Bagaimana saya bisa menghasilkan mesh navigasi 2d di lingkungan yang dinamis saat runtime?

9

Jadi saya sudah memahami cara menggunakan A * untuk mencari jalan, dan saya bisa menggunakannya di grid. Namun, dunia gim saya sangat besar dan saya memiliki banyak musuh yang bergerak ke arah pemain, yang merupakan target yang bergerak, sehingga sistem grid terlalu lambat untuk pencarian jalur. Saya perlu menyederhanakan grafik simpul saya dengan menggunakan mesh navigasi.

Saya memahami konsep "bagaimana" mesh bekerja (menemukan jalur melalui node pada simpul dan / atau pusat-pusat tepi poligon).

Game saya menggunakan rintangan dinamis yang dihasilkan secara prosedural saat run-time.

Saya tidak bisa membungkus kepala saya di sekitar cara mengambil pesawat yang memiliki banyak hambatan di dalamnya dan secara sistematis membagi area walkable menjadi poligon untuk navigasi mesh, seperti gambar berikut.

jala navigasi

Di mana saya memulai? Bagaimana saya tahu kapan segmen area yang bisa berjalan sudah ditentukan, atau lebih buruk, ketika saya menyadari saya perlu membagi area yang bisa didefinisikan sebelumnya sebagai algoritma "berjalan" melalui peta?

Saya menggunakan javascript di nodejs, jika itu penting.

Stephen
sumber
1
Partisi dinamis yang Anda coba implementasikan akan bergantung pada spesifikasi elemen peta Anda. Apakah elemen hambatan Anda seluruhnya terdiri dari kotak yang disejajarkan dengan persegi panjang seperti yang ditunjukkan pada contoh Anda? Rotasi persegi panjang? Poligon tidak teratur? Atau bentuk non-poligon dengan banyak kurva? Apakah Anda memiliki data titik / poli untuk bentuk hambatan? Jika demikian, apakah data bentuk itu dalam hal segitiga, persegi panjang, poligon cembung eksklusif atau campuran poligon cembung dan cekung?
Matius R
@ Matthew Dunia saya terdiri dari rintangan poligon cembung, tidak ada kurva dan tidak ada poligon cekung. Setiap rintangan disimpan sebagai objek poligon dengan simpul diwakili oleh objek vektor.
Stephen
1
Untuk apa nilainya, saya sedang mengerjakan solusi berdasarkan makalah ini: gradworks.umi.com/3493710.pdf Jika saya berhasil saya akan memposting solusi saya.
Stephen
1
jala navigasi tidak ada di sana hingga 100% memberi tahu Anda apakah Anda bisa pergi ke suatu tempat atau tidak, itu hanya garis dasar area yang bisa dilewati, Anda masih harus melakukan pemeriksaan tabrakan terhadap objek dinamis, sunting: cukup banyak apa yang dikatakan Ray
dreta
@Stephen - Lihat jawaban Komentar Panjang .
Matius R

Jawaban:

3

@Stephen - Komentar Panjang - Makalah itu sepertinya layak dibaca ketika saya punya waktu. Pada dasarnya apa yang saya sarankan adalah sesuatu di sepanjang garis Algoritma Hertel-Mehlhorn yang disebutkan dalam makalah (referensi untuk algoritma spesifik ini dapat ditemukan di sini http://www.bringyou.to/compgeom/ ) dengan tambahan membagi lagi sisi-sisi peta (di luar batas area bermain) beberapa waktu untuk mengurangi kemunculan beberapa segitiga kecil yang terbentuk di sudut-sudut. Segitiga-segitiga kecil itu bisa bermasalah karena ujung-ujungnya bisa lebih kecil dari yang Anda cari sebelumnya. The Hertel-Mehlhorn adalah untuk pengurangan poligon yang dihasilkan oleh partisi segitiga jika Anda tertarik di sini lebih lanjut tentang triangulasi:http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm .

Juga, jika Anda lebih suka tidak menemukan kembali roda, saya pikir perpustakaan ini benar-benar akan melakukan semua yang Anda butuhkan: http://code.google.com/p/polypartition/ . Ini membentuk triangulasi dan reduksi dengan salah satu dari sejumlah opsi yang berbeda termasuk Hertel-Mehlhorn. Ini adalah Lisensi MIT yang artinya dapat digunakan untuk proyek sumber tertutup dan komersial jika itu merupakan masalah.

Jika Anda memutuskan untuk terus bekerja pada implementasi Anda sendiri, saya ingin melihat apa yang Anda hasilkan.

Matthew R
sumber
1
Jawaban yang bagus, @Mathew. Dan Anda pasti harus membaca makalah itu! Sangat mudah untuk mengikuti dan menjelaskan teknik yang hebat (terutama Lampiran A yang berbicara tentang penemuan berbasis agen / generasi mesh). Saya sedang mengkode versi algoritma ini untuk javascript, dan itu akan berjalan baik. Saya akan mempostingnya sebagai jawaban ketika sudah selesai.
Stephen
@Stephen akan senang melihat karya ini
kevzettler
@Stephen Saya mencari versi javascript terlalu
Apolo
6

Daripada mesh, Anda mungkin hanya mempertimbangkan pendekatan A * hirarkis. Keuntungan terbesar mesh adalah dalam berhadapan dengan dunia game yang tidak selaras grid, daripada mengurangi kompleksitas dari grid.

Dengan pendekatan hierarkis, Anda membagi dunia Anda berulang kali (seperti pohon quad), dan menghasilkan informasi konektivitas antara node. Anda kemudian dapat dengan cepat membuat jalur antara bongkahan besar dunia, dan hanya menggunakan kisi resolusi tinggi untuk menemukan lintasan dalam bongkahan yang lebih besar.

Pendekatan hierarkis akan memberikan urutan kinerja yang lebih baik, sementara mesh terbaik hanya akan memberi Anda peningkatan linier kecil.

Pendekatan naif adalah dengan hanya membagi dunia Anda ke dalam X oleh X potongan grid yang lebih besar, menghasilkan info konektivitas di antara mereka (misalnya, apakah ada jalur antara melalui potongan 2x1 dari 3x1 ke 2x2, dan berapa jarak jalur rata-rata) .

Perhatikan bahwa Anda mungkin tidak selalu mendapatkan jalur yang ideal dengan pendekatan ini dalam beberapa keadaan tertentu. Menghasilkan potongan-potongan berukuran variabel mengurangi masalah, tapi jujur ​​itu biasanya hanya cara yang lebih mudah untuk menghindari membuat dengan jalur masalah dan mengandalkan kenyataan bahwa pemain sangat tidak mungkin untuk melihat musuh mengambil jalur suboptimal kecuali di sebagian besar kasus merosot.

Sean Middleditch
sumber
1
Saya harus menjelaskan lebih lanjut: Game saya tidak sejajar dengan grid. Saya sedang membangun sebuah grid di area 800 x 600 piksel, setiap pixel menjadi satu ruang di grid (saya masih mencari tahu A *, jadi saya belum memikirkan kinerja ini). Saya memiliki kendala yang tidak sesederhana yang ada pada contoh gambar di atas, saya hanya mencoba menggambarkan masalahnya. Jelas lapangan bermain seperti itu perlu direvisi, dan setelah beberapa penelitian saya pikir nav mesh akan menjadi cara yang tepat untuk pergi.
Stephen
3

Saya pikir Anda mungkin terlalu rumit ini. Anda mungkin tidak perlu membuat jaring navigasi dengan cepat. Alih-alih memiliki jaring navigasi statis untuk dunia basis Anda.

Melintasi rintangan dapat diselesaikan dengan menggunakan perilaku kemudi (gunakan penghindaran rintangan). Jika hambatan Anda begitu besar sehingga memenuhi atau benar-benar memblokir perjalanan dari satu nav-poli ke yang berikutnya, maka miliki beberapa cara untuk memeriksa kasing tepi ini dan menghitung ulang jalur antara poli yang saat ini Anda masuki dan yang Anda blokir dari.

Ray Dey
sumber