visionOS 27: allAnchors and anchorUpdates disagree on WorldAnchor transforms (different coordinate frame)

After updating to visionOS 27.0, WorldTrackingProvider.allAnchors returns WorldAnchor.originFromAnchorTransform values that do not match what anchorUpdates delivers for the same anchor, read at the same moment, both isTracked == true, with no .updated event in between.

The difference is a rigid frame change, not drift:

  • Same vertical offset on every anchor: -1.173 m. Identical across two apps and two days with the head at 1.13 m and 1.22 m, so a constant, not head height.
  • Horizontal deltas vary per anchor, but inter-anchor distances are preserved, so it is a yaw plus translation.
  • Stable over time, same across launches.

anchorUpdates matches the ImmersiveSpace frame RealityKit draws in. allAnchors does not. On visionOS 26 both agreed.

Same anchor, same instant:

  • allAnchors (0.1486, -0.7143, 0.2231)
  • anchorUpdates (0.1316, 0.4590, -1.0955)
  • device pose (0.0073, 1.2195, -0.0038)

Four other anchors, delta = allAnchors - anchorUpdates:

  • ( 2.6933, -1.1733, -0.2514)
  • (-0.0810, -1.1733, 1.1339)
  • ( 0.1878, -1.1733, 0.9891)
  • ( 2.6289, -1.1733, -0.1809)

In our app this showed up as a placed model vanishing after a scene switch: we re-pinned the model root from allAnchors, and it landed below the floor behind the user.

A standalone sample (one provider, one anchor, a green sphere from anchorUpdates, a red sphere from allAnchors) shows two spheres on visionOS 27.0, the red one below the floor:

  • added F21942C4-… at (-0.031, 0.712, -0.976)
  • update added F21942C4-… tracked=true at (-0.031, 0.712, -0.976)
  • MISMATCH delta (-0.211, -1.173, 1.444) m allAnchors (-0.243, -0.461, 0.468) anchorUpdates (-0.031, 0.712, -0.976) tracked=true device (0.000, 1.129, -0.001)

Questions:

  1. Is allAnchors now intentionally expressed in a different frame on visionOS 27, for example related to the new ARKitCoordinateSpaceProviding / coordinateSpace(correction:) API? The documentation for allAnchors does not mention it.
  2. If so, which frame is it, and how should it be converted to the ImmersiveSpace frame?

Workaround we use: read transforms only from anchorUpdates into a per-id cache and never position from allAnchors.

Filed as FB24799304. Minimal repro project attached to the feedback.

visionOS 27: allAnchors and anchorUpdates disagree on WorldAnchor transforms (different coordinate frame)
 
 
Q