Navigation and section journeys
Localize first. Load normal/default POIs with RefreshPointsOfInterest; read the deduplicated snapshot through GetPointsOfInterest. StartNavigation(DestinationPoiId) resolves a loaded POI. NavigateToPoi accepts a complete stable ID, place/section and canonical map position, enabling a destination in a different section of the same place.
Routes use the backend section path and a millimetre-canonicalized graph, with Euclidean A*, endpoint snapping and full final POI approach distance. Remote BypassPathFinding can select a direct two-point route without graph search. They need no Unreal NavMesh. The session loads data asynchronously, rejects stale generations and publishes FGraffityARNavigationState via OnNavigationChanged.
RemainingMetres is in metres. MapLocalRoute uses Unreal axes/world units in the localized map-root space: attach a host spline/marker renderer to that matching root. Actions are None, Forward, Left, Right, Up, Down, Arrived, Continue and Unavailable. The default cadence is 15 Hz (remote NavigationFps, bounded to 1–60 Hz); arrival is within 1 m, waypoint tolerance 0.5 m, turn threshold 30 degrees and vertical threshold 1 m.
At a section exit the SDK waits for ContinueToNextSection. The final destination and preferred transition survive that explicit action. A fresh fix re-fetches from the section actually detected. Missing/equal floor ordinals remain unknown and never invent a floor direction. Cross-place destinations are rejected.
Read loading/error/continuation state in your own UI, or use the optional UGraffityARGuidanceWidget. The widget reads public state and never logs duplicate navigation events. Real walking, off-route behavior and multi-floor physical alignment remain unqualified.