В настоящее время я занимаюсь поиском путей, и моя симуляция заключается в следующем: у меня есть трехмерная сцена с изображением начальной и конечной точек, я могу создавать навигационные сетки, путевые точки и полигоны, чтобы помочь с поиском путей.
Я попробовал алгоритм A * и некоторые его варианты, и они отлично работают. Однако теперь меня больше интересует «динамическое» нахождение путей. Например, при поиске пути из точки A в точку B, если неожиданно появляется новое препятствие, я хочу, чтобы мой алгоритм сразу же смог перепланировать путь и не начинать поиск с нуля снова.
Я немного почитал алгоритм D * и подумал, будет ли это подходящим для того, что мне нужно, или это будет излишним.
Поэтому мои вопросы в основном таковы: какой алгоритм лучше всего подходит для динамического поиска путей в реальном времени? ИЛИ какую комбинацию техник я мог бы использовать вместо этого?
источник
Ответы:
D * весьма вовлечен - я не рекомендую пытаться реализовать это. Даже когда проекты хорошо финансируются и разрабатываются умными / опытными людьми, D * lite используется, потому что D * - такая боль, чтобы получить право.
Вас может заинтересовать эта презентация, которая включает в себя обсуждение поиска пути Left 4 Dead:
http://www.valvesoftware.com/publications/2009/ai_systems_of_l4d_mike_booth.pdf
Один из подходов состоит в том, чтобы использовать грубый поиск уровня A *, чтобы получить общий путь для агента, а затем выполнить точный поиск уровня A * для локальной среды агента. Таким образом, вы можете быстро пересчитать детали курса A * поиска, если местность меняется, и затем быстро пересчитать детализацию A * поиска для небольшого сегмента среды. Это не идеально. Он работает до тех пор, пока ваши препятствия не могут блокировать несколько узлов графа с деталями курса, что хорошо для большинства игр. Этот метод я рекомендую, если у вас менее 100 агентов.
Если вы хотите поддерживать сотни или тысячи агентов, вы можете реализовать что-то вроде непрерывного скопления людей. Смотрите это исследование: http://grail.cs.washington.edu/projects/crowd-flows/ В нем обсуждается метод, основанный исключительно на процессоре, который может поддерживать тысячи участников в динамической среде.
Если вы хотите поддерживать десятки тысяч или сотни тысяч агентов, вы можете реализовать что-то вроде непрерывных скоплений с помощью графического процессора. См. Здесь для соответствующего исследования: https://a248.e.akamai.net/f/674/9206/0/www2.ati.com/misc/siggraph_asia_08/GPUCrowdSimulation_SLIDES.pdf
Вот видео, демонстрирующее толпы людей в действии: http://www.youtube.com/watch?v=lGOvYyJ6r1c (перейдите к 4:10, чтобы увидеть большие динамические препятствия, такие как автомобили и светофоры, затрагивающие сотни людей, идущих по городу.)
источник
Вы смотрели на простое поведение руля?
http://www.red3d.com/cwr/steer/
Вы можете использовать их, чтобы отклониться от своего пути A *, чтобы избежать локальных препятствий, а затем вернуться на свой путь, как только вы закончите.
Также довольно легко комбинировать несколько видов поведения.
источник
Поскольку ваш пост находится в разделе «Разработка игр» обмена стеками, вот что ответит вам большинство программистов игр: Речь идет не о динамическом поиске путей в реальном времени, а о динамическом пути в реальном времени * после *!
В некоторых случаях, когда край на вашем навигационном графике полностью загораживается, потребуется, чтобы указатель пути пересчитал другой путь, но большую часть времени вы можете просто направлять свои объекты вокруг препятствий, делая прогноз положения и избегая в правильном направлении. Для большинства игр было бы слишком тяжело предсказать со временем положение динамических агентов, тем более что вы не можете точно предсказать действия игрока или решения агента.
Итак, мой совет - начать с реализации Поведения рулевого управления (http://red3d.com/cwr/steer/), обработать случаи, когда путь становится невозможным, а затем добавить слой поверх него для обработки крайних случаев, которые не ' т обрабатываются двумя предыдущими решениями.
Надеюсь это поможет
источник