Navigation3D motion models and path following

Pathfinding only produces a geometric path. This chapter turns it into a flyable trajectory (post-processors) and into per-frame motion (FlightPathFollowComponent).

A path is not motion: the follow component publishes desired velocity and never writes Transform. To feed desired velocity into flight control, see Flight.

Post-processor overview

Post-processors convert a geometric path into a FlightTrajectory with speed hints and validate with CapsuleFree.

TypeMotion modelCan fail
HoverOmnidirectional (multirotor / hover)No (always succeeds)
FixedWingFixed wing (Dubins Airplane)Yes (failed segments tabu-replan)

Failed segments feed pathfinding replan (bounded retries); persistent failure falls back to a straight trajectory.

Hover

Three stages: line-of-sight shortcut → centripetal Catmull-Rom smoothing (optional curvature tightening) → curvature-based speed labels with arrival slowdown ramps.

Relevant FlightAgentConfig: MaxSpeed, MaxAccel, SampleStep, ArrivalSlowdownDistance, MinSpeed, ExtraRadius.

FixedWing

Dubins Airplane: horizontal CSC/CCC shortest paths (MinTurnRadius); vertical linear height interpolation with loiter helices when too steep; G1 continuity at waypoints; per-segment CapsuleFree, failures become tabu.

Extras: MaxClimbAngle (default 0.5 rad), MinAirspeed (default 2.0). Pathfinding-stage turn penalties come from component FixedWingTurnAngleThreshold / FixedWingTurnPenalty (or query config).

Climb trajectories

Separate domain—not SVO flight post-process. FindClimbTrajectoryBetweenPositions(D) returns ClimbTrajectory:

  • Surface geodesic approximation resampled by arc length;
  • Each point carries m_normal (wall-facing), m_tangent, m_speedHint.

ClimbAgentConfig defaults: MaxSpeed 3.0, MaxAccel 6.0, SampleStep 0.5, ProjectMaxDistance 3.0.

FlightPathFollowComponent

Turns a trajectory into a per-frame desired velocity for your motion / physics layer to apply.

Typical usage

Navigation3D::FlightPathFollowRequestBus::Event(
 agentEntityId, &Navigation3D::FlightPathFollowRequests::StartFollowing, trajectory);

// Each frame:
AZ::Vector3 v;
Navigation3D::FlightPathFollowRequestBus::EventResult(
 v, agentEntityId, &Navigation3D::FlightPathFollowRequests::GetDesiredVelocity);
// Apply v in your motion layer

Also: StartFollowingOnVolume, Stop, IsFollowing, GetPreferredVelocity (pre-avoidance intent), GetDesiredOrientation.

FlightFollowConfig

FieldDefaultPurpose
m_lookaheadBase2.0Pure-pursuit base lookahead (m)
m_lookaheadSpeedFactor0.5Lookahead grows with speed
m_arrivalTolerance1.0Arrival distance (m)
m_arrivalSpeedThreshold0.5Arrival speed threshold (m/s)
m_deviationThreshold3.0Fires OnPathDeviated (m)
m_maxSpeed10.0Speed cap
m_headingModeVelocityDirectionHeading mode
m_lookaheadSafetyChecktrueCapsuleFree lookahead against SVO
m_fixedWingfalseFixed-wing follow (no hover / reverse)
m_minAirspeed2.0Fixed-wing min airspeed
m_avoidancesee belowVelocity-obstacle avoidance

FlightHeadingMode: VelocityDirection / TowardTarget / Free (external control).

Velocity obstacles (VelocityObstacleConfig)

FieldDefaultPurpose
m_enabledtrueEnable avoidance
m_queryRadius10.0Nearby dynamic-body query radius (m)
m_timeHorizon2.0Time horizon (s)
m_queryIntervalTicks2Re-query obstacles every N ticks
m_sampleDirections24Candidate velocity directions
m_reciprocalfalseReciprocal avoidance (ORCA-style)

Global switch: /O3DE/Gems/Navigation3D/Runtime/VelocityObstacleEnabled (default true).

Lifecycle notifications

FlightPathFollowNotificationBus: OnDesiredVelocityUpdated / OnPathCompleted / OnPathDeviated / OnPathBlocked / OnAvoidanceFailed (scriptable).

Hook into your motion layer

Query → FlightTrajectory
 → FlightPathFollow.StartFollowing
 → each frame GetDesiredVelocity → your motion / physics → Transform
 → deviate / blocked → your logic re-queries
  • Follow only answers “where / how fast”; not “how to move”.
  • Listen for OnPathDeviated / OnPathBlocked to decide when to replan.

Next steps


Copyright © 2026 DawnEngine. All rights reserved.

DawnEngine is a commercial 3D engine distributed under the DawnEngine end-user license agreement. Engine binaries and source are proprietary and are not covered by the licenses below.

Documentation only: the prose and templates on this site are a derivative work of Open 3D Engine (O3DE) documentation by the O3DE Contributors, used under CC BY 4.0 (documentation content), Apache 2.0 (site code), and the MIT license (inline code samples).

The open-source 3D engine that DawnEngine is built on top of is Open 3D Engine . DawnEngine is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the O3DE project. “O3DE” and “Open 3D Engine” are trademarks of The Linux Foundation.