Мой вопрос: каков наилучший подход к поиску пути на неровной поверхности планеты?
Исходная информация
Я создал планету из карт смещения 6 спроектированных сфер. Плоскости первоначально сформировали куб, прежде чем проецироваться в форму сферы.
Мне интересно, можно ли использовать каждую «грань проецируемой сферой куба» в качестве сетки и использовать простой алгоритм A *, чтобы найти наилучший возможный маршрут, я также хотел бы, чтобы высота смещения учитывалась, чтобы путь избегал подъема. горы и т. д. (я полагаю, это будет эвристика в алгоритме A *) Еще одно соображение заключается в том, что я достиг планетарного движения , используя физический двигатель Unity3d, применяя гравитацию к центру планеты. Будет ли мое предлагаемое решение требовать, чтобы движение агентов контролировалось независимо от гравитационной физики.
Чтобы лучше сформулировать мой вопрос, это мое нынешнее планетарное тело:
Ответы:
Кажется, вы уже ответили на свой вопрос. A *, вероятно, лучший подход. Да, конечно, его можно использовать так, как вы описываете, включая информацию о высоте, чтобы избежать гор. Пока вы можете получить доступ к информации о любой сетке на поверхности вашего мира, нет причин, по которым вы не можете использовать ее в эвристике A *.
Наконец, вы путаете поиск пути с путем следования в конце вашего вопроса. Поиск пути не заботится о гравитации, если вы не добавите его в качестве эвристического и если вы находитесь на поверхности планеты, гравитация будет практически одинаковой по всей поверхности. Во многих играх есть гравитация вместе с движением, я не вижу причин, по которым вы не можете.
По сути, мы хотим отобразить переход от красного к синему, чтобы он был таким же на сфере, как и на кубе.
Поскольку A * часто получает соседей к своему текущему узлу, вы можете легко создать набор функций для получения соседних узлов. Так , например,
getXPlus()
,getXMinus()
,getZPlus()
и так далее. Эти функции возьмут текущий узел и вернут узел в направлении, указанном в имени функции.В большинстве случаев эти функции могут просто увеличивать значение и выполняться по краям, которые будут меняться.
Вы захотите отобразить поверхность вашего куба в 2D систему координат. Как бы вы ни делали, это зависит от вас, им не нужно выстраиваться в линию, просто присвойте каждому пространству сетки уникальную координату X, Y.
Теперь, когда на краю, и получая соседнее пространство сетки, это не обязательно будет просто увеличивать координаты. Мы должны выяснить, к какому лицу мы движемся, и переключиться на координаты этого лица.
Например, получение здесь координаты XPlus изменит координаты X и Y, потому что мы перемещаемся в новое пространство сетки на новой грани. Зеленая линия представляет грань между двумя гранями.
Теперь это всего лишь глобальные координаты, может быть проще использовать внутреннюю локальную систему координат с 3-м измерением, представляющим грань куба, на которой вы находитесь в данный момент.
В любом случае, вам нужно иметь уникальную координату для каждого пространства сетки на поверхности куба. Переход между ними будет зависеть от того, как вы реализуете систему координат. Вам также необходимо знать, где эта координата отображается на поверхности сферы.
Все это в конечном итоге должно быть удалено, чтобы вы даже не знали об этом.
источник