keiken · research

2026-07-05 · paper

Three points, one world: notes on 3-point similarity calibration

Working notes — this will grow into the full write-up of the calibration method used in the passthrough headset and HoloLens registration work.

The problem

You have three points measured in two coordinate frames: the tracker's frame and the world you want to draw in. You need the rigid transform (plus uniform scale) that maps one onto the other, so a virtual object placed on a real table stays on the table.

Formally: given correspondences pᵢ ↔ qᵢ (i = 1..3), find scale s, rotation R, translation t minimizing

E = Σᵢ ‖ qᵢ − (s·R·pᵢ + t) ‖²

The closed form

Three non-collinear points fully determine the similarity transform. The classical route (Horn 1987; Umeyama 1991):

  1. Center both point sets on their centroids.
  2. Scale from the ratio of RMS radii.
  3. Rotation from the SVD of the cross-covariance matrix, with the determinant guard so you get a rotation, not a reflection.
  4. Translation falls out: t = q̄ − s·R·p̄.

What actually goes wrong

  • Near-collinear pick points. The rotation about the points' common axis is unobservable; conditioning explodes. Users pick three points on the edge of a table more often than you'd think.
  • Anisotropic measurement noise. The tracker is worse along depth; a least-squares fit that assumes isotropic noise silently tilts the world.
  • The residual is the product. residual < ε is not a debug metric — it is the honest advertisement of registration quality, and it belongs in the UI.

More to come: pick-point UX that avoids degenerate configurations, and a comparison against 4+ point over-determined fits.

← writing · index