Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/facett

facett-map3d/.nornir/camera-nav-tilt-bearing.md

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:

  1. bearing rotates the heading — a +90° bearing change rotates the horizontal heading unit-vector by ~90° (angle between them, err < 1°).
  2. 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).
  3. round-trip — set_bearing_deg(b)→bearing_deg()≈b, set_tilt_deg(t)→tilt_deg()≈t.
  4. deterministic — pose is a pure function of (bearing, tilt) under settle().

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.