Bagaimana saya bisa menghasilkan mesh navigasi untuk kotak ubin?

18

Saya belum benar-benar mulai pemrograman untuk yang satu ini, tapi saya ingin melihat bagaimana saya akan melakukan ini.

Katakanlah saya memiliki kotak ubin, semua dengan ukuran yang sama, beberapa dapat dilalui dan beberapa tidak. Bagaimana cara saya membuat mesh navigasi poligon dari kisi ini?

Gagasan saya adalah mengeluarkan ubin yang tidak dapat dilintasi dan memperpanjang garis dari tepi sana untuk membuat poligon ... itu saja yang saya dapatkan sejauh ini. Ada saran?

Ross Hays
sumber
2
Secara teknis grid ini hampir setara dengan navigasi mesh. Saya menduga Anda benar-benar meminta cara untuk mengoptimalkan kotak dan menyatukan kotak yang berdekatan.
Kylotan
@Kylotan Ya itulah yang saya maksudkan, hanya cara untuk menggabungkan poligon yang berdekatan.
Ross Hays

Jawaban:

28

Inilah salah satu metode yang saya buat ketika melakukan navmesh untuk game RTS. Perhatikan bahwa ini adalah buatan sendiri, tidak ada alat pihak ketiga yang digunakan, saya butuh sekitar 3 minggu untuk menerapkan dan memperbaiki bug:

  1. Gunakan algoritma Marching Squares untuk mengubah ubin hambatan menjadi garis besar . Perhatikan bahwa tepi peta juga merupakan garis besar dan perlu dimasukkan juga.
  2. Kurangi jumlah poin dalam garis besar menggunakan algoritma Douglas-Peucker (garis ungu di gambar bawah)
  3. Masukkan semua poin ke dalam triangulasi Delaunay (untuk mendapatkan segitiga yang paling seragam)
  4. Tambahkan titik tambahan di area kosong dan di sepanjang tepi peta (untuk mendapatkan lebih banyak bahkan navmesh)
  5. Periksa bersama garis besar hambatan dan flip poligon yang diproduksi oleh Delaunay untuk mencocokkan garis besar. - Seringkali Delaunay dapat menempatkan segitiga (abu-abu) yang tidak sesuai dengan garis besar Anda (merah), maka Anda perlu mendeteksi dan membaliknya. Menyatukan mereka kembali ke dalam poligon, membaginya sepanjang garis (s) dan melakukan triangulasi secara manual masukkan deskripsi gambar di sini
  6. Klip halangan jeroan - menghapus poligon yang berada dalam rintangan (merah muda pada gambar di atas)
  7. Isi data konektivitas antara segitiga dan simpul yang tersisa sesuai kebutuhan - itulah navmesh Anda.

Hasil:

tilemap navmesh

Kromster berkata mendukung Monica
sumber
1

Jerat biasanya diimplementasikan sebagai grafik. Jika Anda ingin menerapkan pencarian jalur di peta berdasarkan kisi, lakukan hal berikut:

Buat grafik di mana setiap kuadrat traversable direpresentasikan sebagai simpul. Setiap pasangan kotak yang dapat dilintasi yang direpresentasikan sebagai simpul, akan memiliki keunggulan di antaranya. Dan kamu sudah selesai.

serigala
sumber
1
Ini bukan bagaimana navmesh biasanya diimplementasikan. Tujuan dari navmesh (dan, saya bayangkan, alasan si penanya bahkan mengajukan pertanyaan mereka di sini) adalah untuk mengoptimalkan grafik hingga jumlah poligon yang diperlukan minimal (biasanya segitiga) yang menjangkau ruang yang paling berguna untuk mengurangi jumlah langkah-langkah yang diperlukan untuk menemukan jalur yang baik, dan jejak memori diperlukan untuk menentukan mesh. Implementasi yang mentah akan memakan banyak memori, dan akan membuang waktu pemrosesan AI yang berharga.
Gurgadurgen
Anda benar. Tentu saja penipisan (pengurangan poligon) adalah optimasi yang masuk akal dan diinginkan. Hanya saja ketika Anda membaca pertanyaan op, Anda merasa ia hanya ingin mengubah grid menjadi grafik.
wolfdawn