Navigation3D querying

All “ask for a path” EBuses are AZ::ComponentBuss addressed by the target entity’s EntityId.

Which bus to use

Need cross ground / air / climb?
 Yes → NavigationQueryRequestBus (HybridNavigationComponent)
 No, flight only → FlightNavigationRequestBus (FlightNavigationComponent)
 No, climb only → ClimbNavigationRequestBus (ClimbNavigationComponent)

Only occupancy / clearance / snap?
 → NavigationVolumeRequestBus (SvoNavigationVolumeComponent)

Gameplay code should prefer the unified facade (double precision, multi-domain, sync + async).

Implemented by HybridNavigationComponent.

Path queries

#include <Navigation3D/NavigationQueryBus.h>

Navigation3D::NavigationQueryConfig cfg;
cfg.m_agentRadius = 0.5f;
cfg.m_postProcessor = Navigation3D::FlightPostProcessorType::Hover;

Navigation3D::NavigationPath path;
Navigation3D::NavigationQueryRequestBus::EventResult(
 path, agentEntityId,
 &Navigation3D::NavigationQueryRequests::FindPath,
 Navigation3D::NavigationDomain::Air, fromD, toD, cfg);

for (const auto& wp : path.m_waypoints)
{
 // wp.m_position (Vector3d), wp.m_domain, wp.m_flag (TakeOffAt / LandAt)
}

Async: FindPathAsync returns a NavigationQueryHandle; results arrive on NavigationQueryNotificationBus::OnPathReady. Cancel with CancelPath.

Spatial primitives

SyncAsyncPurpose
FindNearestFreePosition*AsyncSnap to nearest free position in radius
FindDistanceToObstacle*AsyncClearance to nearest obstacle
IsReachable*AsyncWhether two points are reachable
FindRandomReachablePoint*AsyncSample a reachable point with a seed
FieldDefaultPurpose
m_agentRadius0.5Pick radius tier
m_postProcessorHoverMotion model
m_priorityNormalAsync priority Low / Normal / High
m_heightBandLow/High / m_heightPenaltyPerMeter0Height-band preference
m_allowFreeVerticalTransfer / m_transferCostScalefalse / 1.0VTOL and link cost
m_preferredLinks / m_forbiddenLinksemptyPrefer / forbid domain-link entities
m_detourEntity etc.invalidOverride per-domain backend entities

NavigationPathResult::IsSuccess() equals m_reason == FlightFailureReason::None.

FlightNavigationRequestBus (flight agent)

// Sync (single-precision world)
FindFlightPathBetweenPositions(from, to)
FindFlightPathBetweenPositionsD(fromD, toD) // double
FindFlightPathBetweenEntities(fromId, toId)

// Async
FindFlightPathAsync(FlightQueryConfig)  FlightQueryHandle
CancelFlightPath(handle)
// Result: FlightNavigationNotificationBus::OnFlightPathReady

Async example:

Navigation3D::FlightQueryConfig q;
q.m_from = fromWorld;
q.m_to = toWorld;
q.m_priority = Navigation3D::FlightQueryPriority::High;

Navigation3D::FlightQueryHandle handle;
Navigation3D::FlightNavigationRequestBus::EventResult(
 handle, agentEntityId,
 &Navigation3D::FlightNavigationRequests::FindFlightPathAsync, q);

Also: IsReachable / IsReachableD, FindRandomReachablePoint / *D.

Build and readiness

RebuildVolume();
RebuildRegion(const AZ::AabbD& region);
bool IsVolumeReady() const;
SetActiveRegion(const AZ::AabbD& worldRegion); // streaming pages

Occupancy and spatial queries

IsPositionFree / IsPositionFreeD, FindNearestFreePosition(D), FindDistanceToObstacle(D). outDistance == maxDistance means clearance ≥ maxDistance.

Runtime cost field

AddCostModifierVolume / AddCostModifierBox / AddTimeVaryingCostModifierVolume / UpdateCostModifierMultiplier / RemoveCostModifierVolume. multiplier < 1 prefers, > 1 penalizes, ≥ ~1e9 is no-fly. Prefer declarative components—see Authoring and baking.

Notification: OnNavigationVolumeReady.

Sync vs async

SyncAsync
When it returnsSame frame: pathfind + post-processImmediately with a handle; advances across frames
Use whenLow frequency / small volumesHigh frequency / large maps / many agents
ResultsDirect return valueNotification-bus callbacks
CancelCancelPath / CancelFlightPath

Results match (determinism contract); async only changes completion time. Budgets in Debugging.

ClimbNavigationRequestBus (climb)

v1 is sync only—no async / notification bus.

RebuildSurface();
bool IsSurfaceReady() const;
bool IsPositionClimbable(D)(.);

FindClimbPathBetweenPositions(from, to); // polyline
FindClimbTrajectoryBetweenPositions(from, to); // with normal / tangent / speed
FindClimbPathBetweenPositionsD / FindClimbTrajectoryBetweenPositionsD

Trajectory kinematics in Motion and following.

Script bindings (ScriptCanvas / Lua)

Request / notification buses with notifications are reflected via BehaviorContext. Examples:

  • NavigationQueryNotificationBus: OnPathReady / OnSpatialQueryReady
  • FlightPathFollowNotificationBus: OnDesiredVelocityUpdated / OnPathCompleted / OnPathDeviated / OnPathBlocked / OnAvoidanceFailed
  • NavigationDomainLinkRequestBus: getters / SetEnabled (category Navigation3D)
self.queryHandler = NavigationQueryNotificationBus.Connect(self, self.entityId)
function MyAgent:OnPathReady(handle, result)
 if result:IsSuccess() then
 -- consume result.m_path / result.m_flightTrajectories
 end
end

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.