🚪 Gates 345 Scene

Seven sessions over 100 minutes relocalized into one shared ARKit world map, then trained into a depth-supervised splat. Click a camera to fly into its photo.

Loading manifest…

Loading reconstruction…

Photo overlay

📄 Capture Graph Code

RegisteredImages.py

"""
Registered Images
=================

A world-anchored scene extended across sessions. Each session's full
``SceneCapture`` (keyframes with pose, depth, exposure, and a best-effort GPS
fix) lands as a dated backup, and its refreshed ``ARWorldMap`` carries forward
into the shared slot so any later session relocalizes into the same coordinate
frame and keeps extending the scene. As each session's frames land, a subscriber
bakes them into a depth-baked Gaussian splat and a self-contained viewer page.
"""

import capturegraph as cg
from server import authoring as cgserver


class SceneSession(cg.Struct):
    user_id: cg.UserID
    location: cg.Location
    capture: cg.SceneCapture


class RegisteredImages(cg.Struct):
    world_map: cg.ARWorldMap
    sessions: cg.Map[cg.Date, SceneSession]
    _metadata: cg.Metadata


@cgserver.target
@cg.procedure(RegisteredImages)
def registered_images(root):
    session = root.sessions[cg.CaptureTime()]

    # Falls back to a brand-new scene only when the slot is ACTUALLY empty —
    # a map still downloading keeps the capture waiting instead of forking it.
    initial_world_map = root.world_map.load_or(cg.ARKitCreateScene())

    capture = cg.ARKitCaptureScene(
        initial_world_map=initial_world_map,
        label="Capture the scene",
        max_speed_mps=1.0,
        max_rotation_dps=20.0,
    )

    session.user_id &= cg.GetUserID()
    session.location &= cg.CaptureLocation()
    session.capture &= capture
    root.world_map &= capture.world_map
New bake published — tap to reload