У меня есть список с координатами - вывод из алгоритма A * - и я бы хотел, чтобы мои персонажи плавно следовали по этому пути с поворотами.
Итак, у меня есть что-то вроде A, и я хочу получить C
Как я могу это сделать ?
РЕДАКТИРОВАТЬ
Чтобы сделать себя немного более понятным:
Меня больше интересует плавный поворот, так как я уже знаю, как пройтись от одного узла к другому.
РЕДАКТИРОВАТЬ
Поскольку многие люди находят это полезным (и я тоже), я публикую ссылку на «Природу кода» Дэниела Шиффмана, где он обсуждает множество проблем игрового ИИ (и физики), например, управление поведением http://natureofcode.com/book/chapter- 6-автономные агенты / # chapter06_section8
c#
unity
path-finding
Patryk
источник
источник
Ответы:
Если вы хотите сгладить траектории в среде на основе тайлов, нет никакого способа применить сглаживание траектории к вашим путевым точкам A *. В своей книге о программировании игрового ИИ Мэтт Бакленд описывает простой и быстрый алгоритм сглаживания пути (в основном удаляет все ребра, которые можно удалить, не вызывая пересечения с вашими препятствиями).
Как только вы удалите ненужные ребра, как это, ваш первый случай ( A -> B ) решен. Сглаживание краев на вашем графике может быть выполнено несколькими способами. Скорее всего, сплайны Эрмита будут работать (в зависимости от плотности препятствий и размера плитки). Другим вариантом может быть управление поведением, когда вы начинаете двигаться в направлении следующей путевой точки, как только вы находитесь на расстоянии половины клетки от текущей цели (это действительно зависит от того, насколько быстро ваш «агент» двигается / поворачивается).
источник
Как уже упоминали другие, для второго случая вам потребуется реализовать некоторый вид сплайна или (на самом деле лучше подходит для вашего примера) дать устройству какое-то поведение руля.
Однако для первого случая есть решение, которое является одновременно более простым и дает лучшие результаты, чем сглаживание пути. Он называется Theta * и представляет собой простое (и относительно новое) расширение A * на сетках, которое позволяет юнитам перемещаться в любом направлении между точками сетки.
Есть хорошая статья, объясняющая Theta * (из которой я украл изображение выше) здесь
источник
Для более реалистичного человеческого движения, попробуйте интегрироваться с поведением рулевого управления. (C # версия классического OpenSteer http://sharpsteer.codeplex.com/ ) Вы получаете выходные данные AStar и позволяете поведению рулевого управления заботиться о перемещении (Один из примеров показывает, как это сделать, перемещаться по пути)
источник
В случае навигации от точки к точке, я использовал разницу в углах (текущее направление игрока и направление от текущей точки к следующей точке), а затем постепенно менял угол к последнему углу, когда происходит движение. Проверьте эту игру здесь, где самолеты перемещаются из одной точки в другую, но поворот не является внезапным, но при внимательном наблюдении можно определить точки пути. (игра работает только на мобильных устройствах, хотя желательно iPhone / iPad).
источник
Мне повезло со сплайнами Catmull-Rom (тип кубического сплайна, также рекомендованный @bummzack). Хорошая часть этого заключается в том, что сплайн всегда проходит контрольные точки, а многие другие - нет. Реализуйте что-то вроде этого:
* время - это значение [0,1] между контрольными точками 1 и 2.
источник
A-> B можно решить с помощью навигационных сеток вместо сетки. Это подразумевает большие изменения в генерации данных поиска пути.
Случаи, такие как C и D, просто обрезают угол: если персонаж движется по траектории и находится внутри «угла» (ячейка, где предыдущие, текущие, следующие ячейки не находятся на прямой линии), нажмите его в направлении как предыдущей, так и следующей ячейки. , Единственная проблема состоит в том, чтобы определить расстояние от реальной позиции (расстояние толкания). Это, вероятно, потребует расстояние от текущей ячейки в качестве входных данных. Что-то вроде этого:
источник