# Coordinate and pose conventions

01Spatial returns the camera pose in map coordinates. Let `T_A_B` transform points from frame B to frame A: M is Map, A is the current AR session, and C is Camera. API `camera_to_world` is `T_M_C`.

`matrix_column_major` is a complete 4 × 4 column-major matrix. Three.js `Matrix4.fromArray()` reads it directly; do not transpose it again.

The API camera axes are CV-style: +X right, +Y down, +Z forward. WebXR/OpenGL-style cameras use +X right, +Y up, -Z forward, so:

```text
D_cv_to_graphics = diag(1, -1, -1, 1)
T_A_M = T_A_C_graphics × D_cv_to_graphics × inverse(T_M_C)
```

Apply `T_A_M` to a shared map root, never to the AR camera. For an object `T_M_O`, use `T_A_O = T_A_M × T_M_O`. Image rotation requires the corresponding inverse axis rotation. Rig.v2 must use the saved AR transform for `poses[0].image`. Metric maps use metres for translation; each map's saved Origin is authoritative.
