Lab 080 – First Look at Unified Coordinate Conversion

visionOS 26 brings a new unified coordinate system that we can use in SwiftUI and RealityKit.

One of the announcements from WWDC 2025 was a Unified Coordinate Conversion API. It was mentioned during some of the sessions and called out on this page.

https://developer.apple.com/visionos/whats-new

The WWDC Session called Better together: SwiftUI and RealityKit has a very short demo, but without much context.

Unfortunately, this new set of features isn’t well documented, at least not that I can find. From what I understand, these features are intended to let us convert between SwiftUI and RealityKit, local and world, etc. so our apps can have a unified context/space.

I was able to piece together enough for this lab. We can move this window around the share space and see updates that reflect the new window position. This position is relative to the world origin–the point in space on the floor below the user at the start of a session. The user can recenter their view and this point will change. It is important to note that this is not a device pose position. It does not update as the user moves around.

struct Lab080: View {

    @State private var posX: Float = 0
    @State private var posY: Float = 0
    @State private var posZ: Float = 0

    var body: some View {
        GeometryReader3D { geometry in

            VStack {
                Text("Unified Coordinate Conversion")
                    .font(.largeTitle)
                    .padding(24)

                VStack {
                    Text("X: \(posX)")
                    Text("Y: \(posY)")
                    Text("Z: \(posZ)")
                }
                .font(.title)
                .padding(24)

            }
            .onGeometryChange3D(for: Point3D.self) { proxy in try! proxy
                    .coordinateSpace3D()
                    .convert(value: Point3D.zero, to: .worldReference)
            } action: { old, new in
                posX = Float(new.x)
                posY = Float(new.y)
                posZ = Float(new.z)
            }
        }
    }
}

I’d love to learn more about these new features. If you know of any documentation or sample projects I should look at, please let me know.

Download the Xcode project with this and many more labs from Step Into Vision.

Questions or feedback?