Note 00 — Goal & approach (Through The Lens Campanile)

**Note** from Bead: Through The Lens Campanile · [canonical source](https://redfish.acequia.io/guerin/.agents/7610bb17-52c1-4e5b-991b-16d61e06ed46/2026-06-16/notes/00-goal-and-approach.md) · session 2026-06-16 · discussion: Talk: Through The Lens Campanile

## Goal Make **through-the-lens (TTL) camera calibration** a first-class, well-documented capability of the ecology: the interaction where a user aligns a photograph with a 3D world by **dragging image-space correspondences**, and the system recovers the camera `(K, R, t)` that took the photo. The world *appears* to warp onto the photo; in fact **only the camera moves**. This bead is the theory/research home; the `#image-pose-uxui` app (`74c30681`) is the running implementation.

## The lineage (one idea, three expressions) 1. **Gleicher & Witkin, "Through-the-Lens Camera Control," SIGGRAPH 1992** — the foundational paper. *Continuous / differential.* The user drags an on-screen point; a small linear system maps cursor velocity ṗ to camera-parameter velocity q̇ each frame; q is integrated. Pinned points are **hard constraints**. No discrete "solve" — the camera is always in motion at the cursor's pace. Uses an 8-vector quaternion camera `q = [f, tx, ty, tz, qw, qx, qy, qz]` chosen for differential good behaviour. 2. **Michael Naimark, "Viewfinder: How to Seamlessly Flickrize Google Earth"** (Google Tech Talk) — applies the idea to overlaying posed user photos onto Google Earth. **Direct ancestor of `#image-pose-uxui`.** Two sub-cases: a 2D↔2D match against Google-Earth frame-grabs (a "hack" via the COM API), and the standalone **27:05 campanile demo**: a photo of UC Berkeley's Campanile calibrated against a 3D wireframe. 3. **Owen Duncan's campanile demo (LM resectioning)** — *discrete.* Drop a UV↔3D pin, run Levenberg–Marquardt (~500 iters) to minimise Σ‖π(K,R,t,Xᵢ)−xᵢ‖² over the accumulated pins, redraw. Repeat per pin. This is what `#image-pose-uxui`'s `solver.js` implements.

## The two paradigms (both reach the same calibrated camera) | | **Gleicher–Witkin TTL** (differential) | **LM resectioning** (Naimark 27:05 / our solver.js) | |---|---|---| | Cadence | continuous: q̇ solved & integrated every frame during the drag | discrete: drop pin → solve to convergence → redraw | | Constraint | pinned points are *hard* (exact) | all pins *soft*, weighted reprojection least-squares | | Math | `J·Jᵀ·λ = ṗ₀ + k_f(p₀−p) − J·q̇₀`; q̇ = q̇₀ + Jᵀλ (eqs. 8,11) | minimise Σ‖π−x‖² by LM with adaptive damping λ | | Why G–W avoid LM | §1¶7: direct nonlinear solves may have no/many solutions — untrustworthy in the interactive loop | LM is robust enough when seeded from the prior solve; our soft prior regularizes the gauge | | DOF "lighting up" | emerges from constraint geometry as pins accumulate | emerges from #constraints: 1→translate, 2→+rotate, 3→P3P, 4→+focal | Same visible phenomenon (translate → rotate → re-project), different mechanism. Per the `#image-pose-uxui` frame, **every constraint is soft** (feedback_every-constraint-is-soft) — TTL's "hard" pins are the stiff-spring limit of the same factor graph.

## Approach for this bead 1. **Document** the goal + paradigms (this note). 2. **Index** the source folder so the videos/transcripts/paper are citable by timestamp/section (note 01). 3. **Survey modern approaches** to TTL / interactive calibration — PnP/EPnP, bundle adjustment, differentiable rendering, learned pose regression, SfM-assisted, NeRF/3DGS inverse-camera — and map each back to the two paradigms (note 02, deep research). 4. Feed refinements back to `#image-pose-uxui` (e.g. the cleaner P3P/4-point intrinsics schedule; an optional differential-TTL mode alongside the LM solver).

## Non-goals - Re-shipping the app here (that's `#image-pose-uxui`). - Copying the large mp4s into the bead (cite the source folder by URL).