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
| Mechanism | Driven by | Pawn needed? | Use case |
|---|---|---|---|
| A. Volume drives an assigned Actor | USDGNavDriverSubsystem (world subsystem, automatic) | No | Easiest: make any Actor fly a path |
| B. A Pawn follows specific Volumes | USDGPathManagerComponent on the Pawn | Yes | Flight capture, camera cruising |
| C. Auto-discover (legacy, default OFF) | Same as B, but auto-scans | Yes | How the capture Pawn BPP_Nav works |
Two hard rules (no double-drive):
- Once a Volume has a Navigated Actor, it is driven only by the subsystem; every Pawn skips it.
- 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)
- Place the Volume: open the Place Actors panel, search
SDG Nav Path Volume, drag it into the scene. - 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 levelLv_TestToolSetuses roughly 2400 × 2350 × 450 cm (X × Y × Z); Z is the vertical flight band. Place it in mid-air with no walls poking through. - Set voxel size: select the Volume → Details → category SDG ▸ Grid → set
VoxelSizeto100(cm, the default; 50–100 indoors). Keep it well below the Volume's shortest edge. - 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. - 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. - 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.
USDGNavDriverSubsystemdiscovers 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).
- Place the Volume: same as steps 1–3 of A, but leave
Navigated Actorempty. - Place the Pawn: in Place Actors search
SDG Nav Path Pawn(classASDGNavPathPawn), drag it in. It ships with aPathManagercomponent. - Tell it which Volumes to fly: select the Pawn → Details → find the
PathManagercomponent → category SDG ▸ PathManager →FollowVolumes→ add one entry, select the Volume from step 1. - Set the speed: select the Pawn → Details → category Nav ▸ Move → set
MoveSpeedto400(cm/s).bUsePIDControlleris OFF by default (constant-speed follow); turn it on for PID flight control. - 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 → setbAutoDiscoverUnassignedVolumes= true, and keepFollowVolumesempty. - The Pawn then flies every Volume in the level that has no Navigated Actor. This is how the capture Pawn
BPP_Navworks. - Priority: a non-empty
FollowVolumesalways wins (auto-discover is ignored while it is set).
Required-parameters checklist
| Scenario | Field (Details category) | Required? | Starter value | One-line meaning |
|---|---|---|---|---|
| All | IADataSDG activated | ✅ Required | — | Nothing runs otherwise (license gate) |
| A / B | Volume size | ✅ Required | ~2400×2350×450 cm | Must enclose open flyable space; default 200³ is too small |
| A / B | VoxelSize (SDG ▸ Grid) | ✅ Required | 100 | Voxel edge (cm), well below the shortest edge |
| A | Navigated Actor (SDG ▸ PathGen) | ✅ Required | pick an Actor | Who walks this path; empty = hand it to a Pawn |
| A | IgnoreActors (SDG ▸ NavPathVolume) | ⭐ Strongly advised | add the navigated Actor | Stops its own collision from blocking voxels |
| B | FollowVolumes (SDG ▸ PathManager) | ✅ Required (B) | add the target Volume | Which Volumes the Pawn flies (unassigned only) |
| B | MoveSpeed (Nav ▸ Move, Pawn) | Optional | 400 | Flight speed (cm/s) |
| C | bAutoDiscoverUnassignedVolumes (SDG ▸ PathManager) | Optional | false | ON = fly every unassigned Volume |
| Common | bLoopAllPaths (SDG ▸ PathManager) | Optional | false | Loop after finishing |
| Common | bAutoAdvanceNext (SDG ▸ PathManager) | Optional | true | Auto-advance to the next spline |
| Common | RandomSeed (SDG ▸ PathGen) | Optional | 12345 | Change the random trajectory |
| Common | bUseRandomPath (SDG ▸ PathGen) | Optional | true | true = random endpoints; false + custom endpoints below |
| Common | NumPaths (SDG ▸ PathGen) | Optional | 1 | How many paths to generate |
| Common | bUseCustomEndpoints / CustomStart / CustomGoal (SDG ▸ PathGen) | Optional | false | Fixed 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"
| Symptom | Key log line | Fix |
|---|---|---|
| Nothing moves at all | IADataSDG is not licensed/loaded; ... DISABLED | IADataSDG 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 move | NavigatedActor '...' 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.