Использование навигационных сеток

../../_images/nav_meshes.webp

2D- и 3D-версии навигационной сетки доступны как NavigationPolygon и NavigationMesh соответственно.

Примечание

Навигационная сетка описывает только проходимую область относительно центрального положения агента. Любые значения радиуса, которые может иметь агент, игнорируются. Чтобы поиск пути учитывал размер агента (коллизию), необходимо соответствующим образом сжать навигационную сетку.

Навигация работает независимо от других компонентов движка, таких как рендеринг и физика. Навигационные сетки — единственное, что учитывается при поиске пути, например, визуальные данные и формы столкновений, полностью игнорируются навигационной системой. Если при поиске пути необходимо учитывать другие данные (например, визуальные данные), необходимо соответствующим образом адаптировать навигационные сетки. Процесс учёта ограничений навигации в навигационных сетках обычно называется запеканием навигационных сеток.

Сравнение выпуклых и вогнутых полигонов Navigation mesh (Навигационной сетки)

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

Если при следовании по навигационным маршрутам у вас возникли проблемы с застреванием или столкновением, всегда помните, что вам необходимо сообщить навигационной системе о своих намерениях с помощью соответствующей навигационной сетки. Сама по себе навигационная система никогда не определит, что это форма столкновения дерева/камня/стены или визуальная сетка, поскольку она знает только: "Здесь мне сказали, что я могу безопасно пройти по этому маршруту, потому что он находится на навигационной сетке".

Запекание навигационной сетки можно выполнить либо с помощью NavigationRegion2D или NavigationRegion3D, либо напрямую с помощью API NavigationServer2D и NavigationServer3D.

Создание навигационной сетки с помощью NavigationRegion

Шаги выпечки навигационной сетки

Запекание навигационной сетки со смещением радиуса агента относительно геометрии.

Запекание навигационной сетки стало более доступным благодаря узлу NavigationRegion. При запекании с использованием узла NavigationRegion отдельные этапы анализа, запекания и обновления региона объединяются в одну функцию.

Узлы доступны в 2D и 3D как NavigationRegion2D и NavigationRegion3D соответственно.

Совет

Навигационную сетку source_geometry_mode можно переключить на анализ определенных имен групп узлов, чтобы узлы, которые необходимо запечь, можно было разместить в любом месте сцены.

При выборе узла NavigationRegion2D в редакторе на верхней панели Редактора появляются параметры запекания, а также инструменты рисования многоугольников.

../../_images/nav_region_baking_01.webp

Для работы региона необходимо добавить ресурс NavigationPolygon.

Свойства для анализа и создания навигационной сетки затем становятся частью используемого ресурса и могут быть найдены в инспекторе ресурсов.

../../_images/nav_region_baking_02.webp

На результат анализа исходной геометрии можно повлиять с помощью следующих свойств.

  • Параметр parsed_geometry_type определяет, следует ли анализировать визуальные объекты, физические объекты или и те, и другие из SceneTree. Подробнее о том, какие объекты анализируются и как, см. в разделе об анализе исходной геометрии ниже.

  • collision_mask фильтрует, какие физические объекты столкновений включаются, когда parsed_geometry_type включает статические коллайдеры.

  • source_geometry_mode, который определяет, с какого узла (узлов) начинать анализ и как обходить SceneTree.

  • source_geometry_group_name используется, когда требуется проанализировать только определённую группу узлов. Зависит от выбранного source_geometry_mode.

После добавления исходной геометрии результат запекания можно контролировать с помощью следующих свойств.

  • cell_size задает размер сетки растеризации и должен соответствовать размеру навигационной карты.

  • agent_radius сжимает запеченную навигационную сетку, чтобы иметь достаточный запас для размера агента (столкновения).

Запекание NavigationRegion2D также можно использовать во время выполнения скриптов.

var on_thread: bool = true
bake_navigation_polygon(on_thread)

Чтобы быстро протестировать 2D-выпечку с настройками по умолчанию:

  • Добавьте NavigationRegion2D.

  • Добавьте ресурс NavigationPolygon к NavigationRegion2D.

  • Добавьте Polygon2D под NavigationRegion2D.

  • Нарисуйте 1 контур NavigationPolygon с помощью выбранного инструмента рисования NavigationRegion2D.

  • Нарисуйте 1 контур Polygon2D внутри контура NavigationPolygon с помощью выбранного инструмента рисования Polygon2D.

  • Нажмите кнопку «bake (запекать)» в редакторе, и должна появиться навигационная сетка.

../../_images/nav_region_baking_01.webp ../../_images/nav_mesh_mini_2d.webp

Создание навигационной сетки с помощью NavigationServer

NavigationServer2D и NavigationServer3D имеют функции API для индивидуального вызова каждого этапа процесса запекания навигационной сетки.

  • parse_source_geometry_data() можно использовать для разбора исходной геометрии в повторно используемый и сериализуемый ресурс.

  • bake_from_source_geometry_data() можно использовать для создания навигационной сетки из уже проанализированных данных, например, чтобы избежать проблем с производительностью во время выполнения при (избыточном) анализе.

  • bake_from_source_geometry_data_async() — то же самое, но запекает навигационную сетку, отложенную с потоками, не блокируя основной поток.

По сравнению с NavigationRegion, NavigationServer обеспечивает более точный контроль над процессом запекания навигационной сетки. Он, в свою очередь, сложнее в использовании, но и предоставляет более расширенные возможности.

Вот некоторые другие преимущества NavigationServer по сравнению с NavigationRegion:

  • Сервер может анализировать исходную геометрию без запекания, например, чтобы кэшировать ее для последующего использования.

  • Сервер позволяет вручную выбрать корневой узел, с которого следует начать разбор исходной геометрии.

  • Сервер может принимать и выпекать данные из процедурно сгенерированных исходных геометрических данных.

  • Сервер может запекать несколько навигационных сеток последовательно, используя (повторно) одни и те же исходные геометрические данные.

Для запекания навигационных сеток с помощью NavigationServer требуется исходная геометрия. Исходная геометрия — это геометрические данные, которые следует учитывать при запекании навигационной сетки. Навигационные сетки для 2D и 3D создаются путём запекания исходной геометрии.

2D- и 3D-версии ресурсов исходной геометрии доступны как NavigationMeshSourceGeometryData2D и NavigationMeshSourceGeometryData3D соответственно.

Исходная геометрия может быть получена из визуальных сеток, из физических столкновений или из процедурно созданных массивов данных, таких как контуры (2D) и треугольные грани (3D). Для удобства исходная геометрия обычно анализируется непосредственно из настроек узлов в SceneTree. При повторном запекании навигационных сеток во время выполнения имейте в виду, что анализ геометрии всегда происходит в основном потоке.

Примечание

SceneTree не является потокобезопасным. Анализ исходной геометрии из SceneTree может выполняться только в основном потоке.

Предупреждение

Данные визуальных сеток и полигонов необходимо получать от графического процессора, что приводит к остановке сервера рендеринга. Для запекания (ре)запекания в реальном времени предпочтительно использовать физические фигуры в качестве проанализированной исходной геометрии.

Исходная геометрия хранится внутри ресурсов, поэтому созданную геометрию можно использовать повторно для нескольких запеканий. Например, для запекания нескольких навигационных сеток для агентов разных размеров из одной исходной геометрии. Это также позволяет сохранять исходную геометрию на диск для последующей загрузки, например, чтобы избежать накладных расходов на её повторный анализ во время выполнения.

Геометрические данные, как правило, должны быть максимально простыми. Необходимо максимальное количество рёбер, но как можно меньше. Особенно в двумерных моделях следует избегать дублирования и вложенности геометрии, поскольку это приводит к необходимости вычисления отверстий полигонов, что может привести к перевёртыванию полигонов. Примером вложенной геометрии может служить небольшая фигура StaticBody2D, полностью помещённая внутрь другой фигуры StaticBody2D.

Выпекание фрагментов navigation mesh (навигационной сетки) для больших миров

Создание фрагментов навигационной сетки

Создание и обновление отдельных фрагментов навигационной сетки во время выполнения.

См. также

Запекание фрагментов навигационной сетки можно увидеть в действии в демонстрационных проектах Navigation Mesh Chunks 2D и Navigation Mesh Chunks 3D.

Чтобы избежать несоответствия краёв между различными фрагментами региона, навигационные сетки обладают двумя важными свойствами для процесса запекания навигационной сетки: границей запекания и размером границы. Вместе они могут использоваться для обеспечения идеального выравнивания краёв между фрагментами региона.

Кусок навигационной сетки с привязкой к контуру и размером границы

Кусок навигационной сетки, запеченный с запеченным краем или запеченный с дополнительным размером рамки.

Граница запекания, которая представляет собой выровненный по осям Rect2 для 2D и AABB для 3D, ограничивает используемую исходную геометрию, отбрасывая всю геометрию, которая находится за пределами границ.

Свойства baking_rect и baking_rect_offset класса NavigationPolygon можно использовать для создания и размещения 2D-границы запекания.

Свойства filter_baking_aabb и filter_baking_aabb_offset класса NavigationMesh можно использовать для создания и размещения границы 3D-запекания.

При задании только границы запекания остаётся ещё одна проблема. На результирующую навигационную сетку неизбежно повлияют необходимые смещения, такие как agent_radius, из-за чего края не будут выравниваться должным образом.

Куски Navigation mesh (навигационной сетки) с пробелами

Фрагменты навигационной сетки с заметными зазорами из-за смещения радиуса запеченного агента.

Именно здесь пригодится свойство border_size для навигационной сетки. Размер границы — это внутренний отступ от границы запекания. Важной характеристикой размера границы является то, что на него не влияют большинство смещений и постобработки, например, agent_radius.

Вместо того, чтобы отбрасывать исходную геометрию, размер границы отбрасывает части конечной поверхности запечённой навигационной сетки. Если граница запекания достаточно велика, размер границы может удалить проблемные части поверхности, оставив только фрагмент нужного размера.

Фрагменты навигационной сетки без пробелов

Фрагменты навигационной сетки с выровненными краями и без зазоров.

Примечание

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

Предупреждение

В 3D функциональность размера границы ограничена осью xz.