OSM-3D garmin-nav — bearing + tilt over the OrbitCamera
The car-navigator ("better than a Garmin") feel is two controls, and they are just the existing OrbitCamera orbit angles renamed into nav vocabulary — additive, no new state, so all the orbit machinery (inertial damping, ground-clamp, perspective projection) is reused unchanged (Law #1).
| Nav term | Meaning | Maps to |
| bearing | compass heading the view looks along, [0,360)° |
turntable azimuth |
| tilt | pitch down from straight-above: 0° = plan/map, 90° = horizon |
90° − elevation |
API (additive on OrbitCamera): bearing_deg() / set_bearing_deg() and tilt_deg() / set_tilt_deg(). set_tilt_deg clamps through the single-source clamp_elev so a nav tilt can never flip past the pole or dive below the horizon (underground). Both are surfaced in pose_json (bearing_deg, tilt_deg) so the robot/testmatrix can observe them.
Headless proof (data, no pixels) — tests/camera_nav_proof.rs
Emits the facett-map3d/camera_tilt_bearing_nav testmatrix cell. Asserts, over a sweep, purely from the pure basis()/eye() math:
- bearing rotates the heading — a
+90°bearing change rotates the horizontal heading unit-vector by ~90° (angle between them, err < 1°). - tilt shallows the pitch — the look direction's downward component rises monotonically toward the horizon as tilt goes
10°→85°; low tilt looks steeply down (pitch_y < −0.5). - round-trip —
set_bearing_deg(b)→bearing_deg()≈b,set_tilt_deg(t)→tilt_deg()≈t. - deterministic — pose is a pure function of
(bearing, tilt)undersettle().
Next headless-verifiable garmin/flight steps (noted, not this shot): building extrusion from OSM height tags, turn/lane arrows, upright collision-managed labels; flight-camera 6-DOF pose-over-a-path assert. Pixel A/B (night mode, GTAO) → bench box.