Войти
ПрограммированиеФорумОбщее

UE4 - NavMesh и Глобус

#0
12:31, 18 июня 2020

Здравствуйте! Потихоньку работаю в движке Unreal Engine 4 над созданием глобальной стратегии про 21-й век. Возник такой вопрос: как сделать навмеш по поверхности планеты? Скриншот прикладываю.
1 | UE4 - NavMesh и Глобус


#1
(Правка: 14:13) 13:20, 18 июня 2020

Скорее всего никак. UE4 использует опенсорсную библиотеку recastnavigation для построения навмеша, которая это не умеет.

Как вариант можно попробрвать развернуть навмеш на плоскости в равнопромежуточной проекции (wgs84) и считать положение юнитов на ней, а рисовать сами юниты уже на реальном глобусе через перепроецировании позиции wgs->cart.

#2
(Правка: 14:42) 14:42, 18 июня 2020

Для анрила есть еще воксельный 3д АИ от чела который сделал иру про насекомых, бесплатный(не помню названия).Возможно совсем не то что нужно, но на костылях и жуки бегают

Звезды красивые, как делал ?

#3
15:32, 18 июня 2020

endeavour_pr
> Звезды красивые, как делал ?
По уроку о том как сделать космический скайбокс на YouTube, там использовали мини-программу Spacescape.

Может быть есть альтернативные варианты для движения ИИ без навмеша?

#4
16:00, 18 июня 2020

StellarWalker
а у вас свой ИИ?
Свою навигацию запилить не хотите? Навмеш из коробки хорош тем, что довольно гибок в заданных рамках (довольно обширных). Но вам же нужна только навигация по сфере - это сильно сужает задачу.

#5
16:13, 18 июня 2020

StellarWalker
> Может быть есть альтернативные варианты для движения ИИ без навмеша?
ДА
https://www.unrealengine.com/marketplace/en-US/product/don-s-3d-p… ing-flying-ai

Только он не для ходьбы по 2д карте

#6
16:42, 18 июня 2020

kkolyan
> а у вас свой ИИ?
Планирую свой сделать.

> Свою навигацию запилить не хотите? Навмеш из коробки хорош тем, что довольно
> гибок в заданных рамках (довольно обширных). Но вам же нужна только навигация
> по сфере - это сильно сужает задачу.
Как можно свою навигацию по сфере запилить?

endeavour_pr
> Только он не для ходьбы по 2д карте
Мне кажется, что такая реализация не подходит. Для юнитов поверхность планеты это по сути плоскость. Они должны всегда находиться на одном расстоянии от центра планеты.

Ещё уточню один момент: планета представляет собой набор акторов. Про реализацию планеты я спрашивал в другой теме: https://gamedev.ru/code/forum/?id=247290

#7
4:52, 19 июня 2020

StellarWalker
> Как можно свою навигацию по сфере запилить?
для продакшна такого не делал никогда, только игрался со смежными технологиями. но мало ли, к чему-то подтолкнут мои сырые идеи)

Берем подходящую по размеру и дискретности модель полигональной сферы. Что мы должны уметь делать с этой сферой:
1. Находить идентификатор треугольника по коллизии с лучом.
2. Находить идентификаторы соседей любого треугольника.
3. Находить мировые координаты вершин любого треугольника.
4. Определять занятость ячейки (в том числе с учетом игровых данных)
Первый пункт должен быть в любом трехмерном движке - уверен в UE4 есть удобный тул для рэйкаста.
Второй, третий и четвертый можно реализовать как через дополнительный индекс (ассоциативный массив). А второй может быть и через указатели на треугольники - может быть в UE4 Так окажется удобнее.


Пишем или берем готовую реализацию алгоритма A*, принимающую на вход произвольный граф. Вот реализация на java в качестве примера - там не так уж и много.
На вход алгоритм получает граф в виде следующих функций:

List<Node> getNeighbours(Node node);// список соседей, на которых разрешен переход из node
double getTransitionCost(Node src, Node dst);// стоимость перехода между соседними узлами
double getHeuristicDistance(Node src, Node dst);// хинт для оптимизации. если возвращать всегда 0, то алгоритм выродится в поиск пути Дейкстры, т.е. будет считать самый кратчайших из возможных путей, но не всегда быстро. если возвращать расстояние между точками, то алгоритм будет обычно отрабатывать значительно быстрее, но найденные пути могут быть не идеальными.
Где Node - идентификатор (или указатель) треугольника. Алгоритму A* все равно что это - он передает их как есть между этими 3 функциями.

Первая функция - это п2 из списка выше (минус непроходимые треугольники). Вторая и третья банально считают расстояние между центрами двух треугольников (хотя третью можно потом реализовать и поизощреннее).

Если вас устраивает сетка - то единицей координат в мире будет идентификатор треугольника.
Если хотите непрерывность, то каждая координата будет структурой из идентификатора треугольника и 3 чисел - расстояний до вершин треугольника. Но тогда придется делать небольшие поправочки в концах и началах маршрутов, т.к. сам A* будет искать путь по треугольникам, а начало и конец пути могут быть не ровно в центрах треугольников.

Какие задачи решает
1. Определение точки под указателем мыши
2. Определение маршрутов из точки А в точку Б с учетом препятствий.

Вроде от Navmesh больше и не надо?

#8
5:19, 19 июня 2020

kkolyan
> для продакшна такого не делал никогда, только игрался со смежными технологиями.
> но мало ли, к чему-то подтолкнут мои сырые идеи)
Спасибо за развернутый ответ) Есть над чем подумать.

#9
(Правка: 11:48) 11:43, 19 июня 2020

а можно без мудянки ?
Типа идея для лайвхака
например создать  6 штук плоских фигней с навмешем, на которых АИ будут что-то делать,  6 как для кубосферы, расчитывать аи на них, а координаты перепроецировать на кубесферу или на твои меши.
Или если сделать сразу сферу такую чтобы ее части были идентичны частям для расчета АИ

#10
(Правка: 12:36) 12:35, 19 июня 2020

endeavour_pr
навскидку:
- как сшить стыки при поиске пути (при этом не переписывая половину этого поиска)?

- как сделать чтобы поиск пути делался с учетом преобразованной из куба в сферу метрики? иначе мы ведь в углах получим сильные искажения маршрутов.

+ Показать

но очень любопытно узнать, если это все получится сделать элегантно.

#11
14:28, 19 июня 2020

kkolyan
> как сшить стыки при поиске пути (при этом не переписывая половину этого
> поиска)?
Без понятия, я предложил идею.
Скорее всего по простому не выйдет со стыками.

во и картинка в тему нашлась

+ Показать
#12
15:14, 19 июня 2020

Если поискать то в гугле вроде даже есть решения, но для юнити.
https://forum.unity.com/threads/navmesh-pathfinding-on-a-sphere.312157/

#13
(Правка: 15:27) 15:26, 19 июня 2020

endeavour_pr
В юнити, насколько я помню, навмеш может иметь произвольную форму, соответственно не должен требовать каких-то особых решений.

Но судя по кол-ву кода по ссылке, есть ньюансы )

ПрограммированиеФорумОбщее