Comment puis-je générer un maillage de navigation pour une grille de tuiles?

18

Je n'ai pas encore commencé à programmer pour celui-ci, mais je voulais voir comment j'allais procéder de toute façon.

Disons que j'ai une grille de tuiles, toutes de la même taille, certaines traversables et d'autres non. Comment pourrais-je créer un maillage de navigation de polygones à partir de cette grille?

Mon idée était de retirer les tuiles non traversables et de prolonger les lignes à partir de ces bords pour créer des polygones ... c'est tout ce que j'ai jusqu'à présent. Aucun conseil?

Ross Hays
la source
2
Techniquement, la grille est à peu près équivalente à un maillage de navigation. Je suppose que vous demandez en fait un moyen d'optimiser la grille et de fusionner les carrés adjacents.
Kylotan
@Kylotan Oui, c'est exactement ce que je voulais dire, juste un moyen de combiner des polygones adjacents.
Ross Hays

Réponses:

28

Voici l'une des méthodes que j'ai trouvées en faisant du navmesh pour un jeu RTS. Notez qu'il s'agit d'un homebrew, aucun outil tiers n'a été utilisé, il m'a fallu environ 3 semaines pour l'implémenter et corriger le bug:

  1. Utilisez l' algorithme Marching Squares pour convertir les tuiles d'obstacles en contours . Notez que les bords de la carte sont également un contour et doivent également être inclus.
  2. Réduisez le nombre de points dans les contours en utilisant l' algorithme Douglas-Peucker (lignes violettes sur l'image du bas)
  3. Alimentez tous les points dans la triangulation de Delaunay (pour obtenir la plupart des triangles uniformes)
  4. Ajoutez des points supplémentaires dans les zones vides et le long des bords de la carte (pour obtenir un navmesh plus uniforme)
  5. Vérifiez le long des contours d'obstacles et inversez les polygones produits par Delaunay pour correspondre aux contours. - Souvent, Delaunay peut placer des triangles (gris) qui ne correspondent pas à vos contours (rouge), alors vous devez les détecter et les retourner. Les joindre à nouveau dans un polygone, le diviser le long des contours et le trianguler manuellement entrez la description de l'image ici
  6. Coupez les entrailles des obstacles - supprimez les polygones qui se trouvent à l'intérieur des obstacles (rose sur l'image ci-dessus)
  7. Remplissez les données de connectivité entre les triangles et les sommets restants selon vos besoins - c'est votre navmesh.

Résultat:

tilemap navmesh

Kromster dit soutenir Monica
la source
1

Les maillages sont généralement implémentés sous forme de graphiques. Si vous souhaitez implémenter la recherche de chemin dans une carte basée sur une grille, procédez comme suit:

Créez un graphique où chaque carré traversable est représenté comme un sommet. Chaque paire de carrés traversables adjacents représentés comme des sommets, aura un bord entre eux. Et tu as fini.

Wolfdawn
la source
1
Ce n'est pas ainsi que les navmeshes sont généralement implémentés. Le but d'un navmesh (et, j'imagine, la raison pour laquelle le demandeur a même posé sa question ici) est d'optimiser le graphique jusqu'à un nombre minimal requis de polygones (généralement des triangles) qui s'étendent sur les espaces les plus utiles pour réduire à la fois le nombre de les étapes nécessaires pour trouver un bon chemin et l'empreinte mémoire requise pour définir le maillage. Une implémentation brute consommerait à la fois une tonne de mémoire et gaspillerait un temps de traitement de l'IA précieux.
Gurgadurgen
Vous avez raison. Bien entendu, la décimation (réduction des polygones) est une optimisation raisonnable et souhaitée. C'est juste que lorsque vous lisez la question de l'op, vous avez l'impression qu'il veut juste transformer une grille en un graphique.
wolfdawn