Je travaille actuellement sur A * pathfinding sur une grille et je cherche à lisser le chemin généré, tout en considérant l'étendue du personnage qui se déplace le long de celui-ci. J'utilise une grille pour la recherche de chemin, mais le mouvement des personnages est en itinérance libre, pas un mouvement strict de tuile à tuile.
Pour obtenir un chemin plus fluide et plus efficace, je fais des traces de ligne sur une grille pour déterminer s'il y a des tuiles impossibles à parcourir entre les tuiles pour raser les coins inutiles.
Cependant, comme une trace de ligne a une étendue nulle, elle ne prend pas en compte l'étendue du caractère et donne de mauvais résultats (ne renvoyant pas de tuiles irrécupérables simplement manquées par la ligne, provoquant des collisions indésirables).
Donc, ce que je recherche, c'est plutôt qu'un algorithme de ligne qui détermine les tuiles en dessous, j'en cherche un qui détermine les tuiles sous une ligne d'étendue à l'échelle de la tuile. Voici une image pour aider à visualiser mon problème!
Quelqu'un a-t-il une idée? J'ai travaillé avec la gamme Bresenham et d'autres alternatives, mais je n'ai pas encore compris comment résoudre ce problème spécifique.
la source
Réponses:
Que diriez-vous si vous tracez une ligne à partir de chaque coin de la «tuile», vous êtes sur chaque coin de la tuile où vous voulez aller. Vous pouvez probablement même optimiser cela à 3 lignes au lieu de quatre. Cela ne détecterait-il pas correctement toutes les tuiles du chemin?
En ce qui concerne les chemins plus lisses, consultez les articles sur le «comportement de pilotage», en particulier ceux qui le combinent avec A *, par exemple ces liens:
la source
Je viens d'implémenter cet algorithme pour un de mes jeux il y a quelques jours! (-8
Voici mon idée sous forme d'image:
Notez que l'algorithme fonctionne avec des rectangles de n'importe quelle taille. il est basé sur le fait qu'un coin du rectangle entre toujours en premier avec n'importe quelle ligne de grille. Cela signifie que vous ne pouvez tracer qu'un seul rayon et obtenir toutes les intersections dont vous avez besoin.
Voici l'algorithme étape par étape:
Il y a des cas de bord ici, comme quand le rayon est exactement vertical / horizontal, ou quand il frappe exactement un coin, mais ce n'est pas difficile.
la source
Cette procédure est une adaptation de bresenham, qui résout la question d'origine.
la source