Skip to main content

3D Navigation: Foolproof Guide

Just follow the clicks. This page covers SDGToolSet's current 3D navigation model: drop a Volume and make an Actor fly along an automatically generated 3D path.

:::tip Read this first SDGToolSet is fully gated by IADataSDG's license. If IADataSDG is not activated, nothing moves (no path is generated, the Pawn does not fly, the assigned Actor stays put). See Installation & Activation first. :::

The 3 mechanisms in 30 seconds​

MechanismDriven byPawn needed?Use case
A. Volume drives an assigned ActorUSDGNavDriverSubsystem (world subsystem, automatic)NoEasiest: make any Actor fly a path
B. A Pawn follows specific VolumesUSDGPathManagerComponent on the PawnYesFlight capture, camera cruising
C. Auto-discover (legacy, default OFF)Same as B, but auto-scansYesHow the capture Pawn BPP_Nav works

Two hard rules (no double-drive):

  1. Once a Volume has a Navigated Actor, it is driven only by the subsystem; every Pawn skips it.
  2. A Pawn flies only Volumes that have NO assigned Actor. The two sets never overlap, so the same Volume/Actor is never driven twice.

Quick Start A: drop a Volume + assign an Actor, let it fly itself (easiest, no Pawn)​

  1. Place the Volume: open the Place Actors panel, search SDG Nav Path Volume, drag it into the scene.
  2. Scale it up (critical step): a freshly placed Volume is only about 200 × 200 × 200 cm — too small, no path can be generated. Use the scale tool (R) to enlarge it so it encloses an open, unobstructed flyable space. Reference: the sample level Lv_TestToolSet uses roughly 2400 × 2350 × 450 cm (X × Y × Z); Z is the vertical flight band. Place it in mid-air with no walls poking through.
  3. Set voxel size: select the Volume → Details → category SDG ▸ Grid → set VoxelSize to 100 (cm, the default; 50–100 indoors). Keep it well below the Volume's shortest edge.
  4. Assign the navigated Actor: Details → category SDG ▸ PathGen → Navigated Actor, pick any Actor in the scene (a Cube, a StaticMeshActor, a camera — all fine). Prefer setting its Mobility to Movable; even a static root is auto-promoted to Movable at runtime.
  5. Add it to IgnoreActors: Details → category SDG ▸ NavPathVolume → IgnoreActors → add one entry, select that same navigated Actor. Otherwise its own collision blocks the voxels and the path may not be able to route around itself.
  6. Press Play (PIE).

What you should see:

  • The assigned Actor first "teleports" to the path start, then flies smoothly along the curve;
  • It stops at the end (no looping by default);
  • The Output Log shows:
[SDG][NavDriver][VOL 0] Driving '<YourActor>' along 1 spline(s).
[SDG][NavDriver] Self-driving 1 assigned-volume group(s).
[SDG][NavDriver] frame 0: '<YourActor>' at (x, y, z)

No Pawn needed. USDGNavDriverSubsystem discovers every Volume that has a Navigated Actor at world BeginPlay, builds the path, and drives it every tick.


Quick Start B: make a Pawn follow specific Volumes​

Prerequisite: the target Volume's Navigated Actor must be empty (a Volume with an assigned Actor is owned by the subsystem, and the Pawn skips it).

  1. Place the Volume: same as steps 1–3 of A, but leave Navigated Actor empty.
  2. Place the Pawn: in Place Actors search SDG Nav Path Pawn (class ASDGNavPathPawn), drag it in. It ships with a PathManager component.
  3. Tell it which Volumes to fly: select the Pawn → Details → find the PathManager component → category SDG ▸ PathManager → FollowVolumes → add one entry, select the Volume from step 1.
  4. Set the speed: select the Pawn → Details → category Nav ▸ Move → set MoveSpeed to 400 (cm/s). bUsePIDController is OFF by default (constant-speed follow); turn it on for PID flight control.
  5. Press Play. The Pawn flies that Volume's path. Output Log:
[SDG][PM] Explicit FollowVolumes: 1 volume(s) to fly.
[SDG][PM] RebuildPaths done: PawnSplines=1 AssignedVolumesSkipped=0 (driven by subsystem) TotalLen=...

:::note Using your own Actor + component If instead of ASDGNavPathPawn you add a USDGPathManagerComponent to your own Actor and drive it via MoveInsideNavVolume(): note that bUseProjectDefaults defaults to true, which overwrites the MoveSpeed you typed in Details with the Project Settings value at BeginPlay. To keep the per-instance speed, set bUseProjectDefaults to false. :::


Mechanism C (advanced, default OFF): let a Pawn auto-claim every "unassigned" Volume​

  • Select the Pawn → PathManager → category SDG ▸ PathManager → set bAutoDiscoverUnassignedVolumes = true, and keep FollowVolumes empty.
  • The Pawn then flies every Volume in the level that has no Navigated Actor. This is how the capture Pawn BPP_Nav works.
  • Priority: a non-empty FollowVolumes always wins (auto-discover is ignored while it is set).

Required-parameters checklist​

ScenarioField (Details category)Required?Starter valueOne-line meaning
AllIADataSDG activated✅ Required—Nothing runs otherwise (license gate)
A / BVolume size✅ Required~2400×2350×450 cmMust enclose open flyable space; default 200³ is too small
A / BVoxelSize (SDG ▸ Grid)✅ Required100Voxel edge (cm), well below the shortest edge
ANavigated Actor (SDG ▸ PathGen)✅ Requiredpick an ActorWho walks this path; empty = hand it to a Pawn
AIgnoreActors (SDG ▸ NavPathVolume)⭐ Strongly advisedadd the navigated ActorStops its own collision from blocking voxels
BFollowVolumes (SDG ▸ PathManager)✅ Required (B)add the target VolumeWhich Volumes the Pawn flies (unassigned only)
BMoveSpeed (Nav ▸ Move, Pawn)Optional400Flight speed (cm/s)
CbAutoDiscoverUnassignedVolumes (SDG ▸ PathManager)OptionalfalseON = fly every unassigned Volume
CommonbLoopAllPaths (SDG ▸ PathManager)OptionalfalseLoop after finishing
CommonbAutoAdvanceNext (SDG ▸ PathManager)OptionaltrueAuto-advance to the next spline
CommonRandomSeed (SDG ▸ PathGen)Optional12345Change the random trajectory
CommonbUseRandomPath (SDG ▸ PathGen)Optionaltruetrue = random endpoints; false + custom endpoints below
CommonNumPaths (SDG ▸ PathGen)Optional1How many paths to generate
CommonbUseCustomEndpoints / CustomStart / CustomGoal (SDG ▸ PathGen)OptionalfalseFixed start/goal (needs bUseRandomPath=false)

Mechanism A's flight speed comes from Project Settings → SDG Navigation Movement.SpeedCmPerSec (default 400 cm/s), not from the Volume.


How to start testing​

In-editor (PIE): just press Play. Open the Output Log (menu Window ▸ Output Log) and check:

  • Mechanism A success: [SDG][NavDriver] Self-driving N assigned-volume group(s).
  • Mechanism B success: [SDG][PM] RebuildPaths done: PawnSplines=N ...
  • Path-quality self-check: [SDG][PM][VOL 0] PathClearance: 0/NN out-of-free (0.0%) Z[...] volZ[...] — the closer the out-of-free ratio is to 0%, the better (the path is not clipping floor/walls).

Command line / headless (advanced):

"<UE_5.8>\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" "<YourProject>.uproject" <MapName> -game -windowed -log

Change the random trajectory without editing the level: append -dpcvars="sdg.nav.SeedOverride=24680" (a value ≥ 0 overrides every Volume's RandomSeed).


Troubleshooting / "nothing moves"​

SymptomKey log lineFix
Nothing moves at allIADataSDG is not licensed/loaded; ... DISABLEDIADataSDG is not activated → activate it. Re-enter PIE afterward; no editor restart needed.
No path[SDG][NavDriver][VOL n] No navigable path generated ... Ensure the volume encloses free space and is at least a few VoxelSize across. (or, Pawn side, BuildVoxelGrid failed / PawnSplines=0)Volume too small, not over open space, or VoxelSize too large → enlarge the Volume, make sure it encloses open space, lower VoxelSize.
Pawn doesn't move[SDG][PM] RebuildPaths done: PawnSplines=0 (no FollowVolumes, auto-discover OFF -> pawn flies nothing).The Pawn has neither FollowVolumes set nor bAutoDiscoverUnassignedVolumes on → configure one of them.
Pawn skipped the Volume[SDG][PM][VOL n] Listed FollowVolume has a NavigatedActor -> owned by USDGNavDriverSubsystem; pawn skips it.You pointed the Pawn at a Volume that has an assigned Actor (mutually exclusive) → either clear that Volume's Navigated Actor, or use an unassigned Volume.
Assigned Actor doesn't moveNavigatedActor '...' unresolved; skipped (no pawn fallback).The referenced Actor was deleted / lives in an unloaded sublevel → re-assign an Actor that exists in the loaded level.
Actor doesn't move, no error(none)The target Actor genuinely cannot be transformed (no movable root component) → use an Actor that has a SceneComponent root and is Movable.
Speed seems locked / wrong(none)In the generic component flow, bUseProjectDefaults=true overwrites the Details MoveSpeed from Project Settings at BeginPlay → set bUseProjectDefaults=false to keep your value.

Good to know (don't panic)​

  • Teleport to start: on the first frame the Actor / Pawn jumps from where you placed it to the "path start", then flies along the line. This is expected, not a bug.
  • No looping by default: bLoopAllPaths = false, so it stops at the end. Set it to true to loop back and forth.

Next steps​

  • Global JSON config, tag conventions, console commands: see Configuration & Tags.
  • Capture synthetic data along the flight path: pair with IADataSDG.