Я пытаюсь найти решение этой проблемы. Я пытаюсь построить навигационную сетку в формате сетки вершин, привязанных к координатам x, y, расположенным в виде квадратов для трехмерного пространства. Но у меня возникают проблемы, пытаясь найти способ сделать это.
Я попытался заглянуть в библиотеку Recast. Это довольно надежный метод, но он явно замедляется с большими картами и открытым пространством. Я также не знаю, как они генерируют вершины и ребра для мирового пространства с помощью карты высот.
Моей следующей мыслью было сделать то, что делал Unreal Engine 3.
https://udn.epicgames.com/Three/NavigationMeshReference.html
Который должен был использовать raycasts для генерации меша. Я не мог понять, как остановить лучевые трансляции.
Итак ... мой следующий вариант был коробкой, возможно, литой коробкой. Создайте разделенный том с размером, равным степени 2. Выровняйте прямоугольник по сетке и снимите прямоугольные призмы вниз как луч. Если он приземляется на часть геометрии, которая является частью земли, и прямоугольник не пересекается, оставьте там квадрат. И продолжайте вниз, пока не будет достигнут предел объема. Чтобы проверить, нужно ли связывать ребра, я полагаю, что я могу проверить, находится ли наклон между двумя парами вершин в пределах пройденного склона, объединить их, если это правда.
Мои основные проблемы ... это не кажется оптимальным. Не думая об этом, при оценке процесс O (N ^ 3) для многослойного уровня. Который может стать довольно противным.
И последний бит для автоматического создания прямоугольных групп этих квадратов. Я не совсем уверен, как это сделать. Реализация Unreal разделяет их по склонам. Тем не менее, я пытаюсь сохранить формат сетки. Так что это не совсем необходимо. Проблема все еще остается при создании больших прямоугольных плиток, чтобы разделить процесс поиска пути на основе плитки. Плитка не может быть ни слишком большой, ни слишком маленькой.
Итак, вопросы ...
Каким был бы эффективный способ создать эту опоясанную навигационную сеть? И какой будет хороший способ создания плиток?