Navigation3D authoring and baking
How to obtain SVO airspace / climb surfaces from scene geometry, when to use each supply mode, and how to place cost zones, no-fly zones, flight corridors, and domain-transfer links.
Three ways to supply an SVO
Scene geometry (Recast / PhysX provider)
├─ AutoBuild (runtime voxelize)
└─ Bake to asset → .svonav → AssetProcessor → .svonav_baked
├─ Assign Baked asset (load all at once)
└─ + Streaming enabled → page with SetActiveRegion
| Mode | When | How |
|---|---|---|
| AutoBuild | Iteration, small volumes | Auto build = true; voxelize on activate |
| Baked asset | Shipping, large / static airspace | Bake → .svonav_baked → Baked asset (AutoBuild ignored) |
| Streaming | Very large worlds | Baked asset + Streaming enabled with SetActiveRegion |
Bake pipeline
Baking is a two-step pipeline:
A. Editor Bake (geometry → source JSON)
- Mount
EditorSvoNavigationVolumeComponent(or climb’sEditorClimbNavigationComponent). - Same entity must offer
RecastNavigationProviderService. - Click Inspector Bake to asset: writes
BakeOutputPath(SVO defaultAssets/Navigation3D/<EntityName>.svonav; climb.climbsurf).
- SVO
GeometrySourcecan record a level / prefab path so AssetBuilder rebakes when geometry changes.
B. AssetBuilder (source → baked product)
| Builder | Input | Output |
|---|---|---|
SvoNavigationBuilderComponent | *.svonav | *.svonav_baked (magic SVON) |
ClimbSurfaceBuilderComponent | *.climbsurf | *.climbsurf_baked |
Offline bake and runtime self-build share the L1 core and are designed to be byte-identical.
C. Runtime consumption
Assign .svonav_baked / .climbsurf_baked to Baked asset; load on OnAssetReady and skip geometry self-build.
| Stage | SVO | Climb |
|---|---|---|
| Source (JSON) | .svonav | .climbsurf |
| Baked product | .svonav_baked | .climbsurf_baked |
Climb surface authoring
- Mount
EditorClimbNavigationComponent+ a geometry provider. - Tune
ClimbBuildConfig(default slope 55°–120°, sample spacing 1 m). - Iterate with
Auto build; for shipping Bake to asset →.climbsurf→ AP →.climbsurf_baked→ Baked asset. - On the AI / Hybrid entity, mount
ClimbNavigationComponent(or point Climb entity at the surface entity) and query viaClimbNavigationRequestBus(see Querying).
Cost zones, no-fly, and flight corridors
These are runtime overlays—changes apply to the next query without rebuilding the SVO. Prefer declarative components.
NavigationCostModifierComponent
- Add a Shape (Box / Sphere / …) plus
NavigationCostModifierComponent. - Set Target volume to the SVO volume.
- Multiplier:
<1prefers,>1penalizes. - No-fly: overrides Multiplier with ~1e9 no-fly cost.
Time-varying costs: NavigationVolumeRequestBus::AddTimeVaryingCostModifierVolume (low/high multipliers + period + phase).
NavigationFlightCorridorComponent
- Add
NavigationFlightCorridorComponent; Target volume points at the SVO. - Waypoints (entity-local) + Radius (half-width) extrude the corridor.
- Preference is clamped to
[0.01, 1.0]—preference only, not penalty / no-fly.
Domain links (takeoff / landing)
- Add
NavigationDomainLinkComponent(needs Transform). - Ground offset / Air offset (entity-local) land in domains A / B.
- Domain A / B, Direction (bidirectional / takeoff only / land only).
- Traversal cost / Max agent radius / Enabled.
Per-query: NavigationQueryConfig::m_preferredLinks / m_forbiddenLinks.
VTOL alternative: enable Free vertical transfer on HybridNavigationComponent so vertical transfers are allowed where free-column height ≥ Safe climb height, without placing every link.
Local rebuild and streaming
- Local rebuild: on local geometry edits call
RebuildRegion(worldAabb)to rebuild only dirty chunks (cheaper thanRebuildVolume()). - Streaming:
Streaming enabledplus World Streaming viaSetActiveRegion. Build submit budget isBuildChunksPerTick(default 4; tunable withnav3d_setBuildBudget).
Large-world airspace often pairs with double-precision rendering / Cesium 3D Tiles.
Editor Test flight
EditorSvoNavigationVolumeComponent Test flight: TestFrom / TestTo (volume-local) and TestPostProcessor draw a path in the viewport immediately—no AssetProcessor wait.
Next steps
- Motion and following — attach motion models to paths
- Debugging — validate volume health and tune budgets