Game Engines
Keep Runtime Objects Out of Your Data Model
Treat GameObjects and Actors as presentations of durable spatial entities, then connect them through tested adapters, commands, and capability-aware services.
Transport, domain, and presentation
Transport models match network payloads. Domain models own stable identity, revisions, permissions, frames, and workflows. Presentation models are Unity GameObjects, Unreal Actors, components, materials, and runtime anchors. Mapping among the three prevents a serialization change from rewriting scene code and prevents object lifetime from becoming data lifetime.
An entity registry connects a durable ID to the active presentation. Objects can be pooled, streamed, or recreated while the domain record remains. The same entity can appear as a list item, map marker, miniature, or full-scale model.
Semantic commands instead of transform spam
Grab and drag are local interaction events. “Move asset to approved pose” is a domain command. Keep local motion responsive, then submit a command with entity ID, pose, frame, intent, and base revision at a commit point such as release or save.
Semantic commands support validation, audit, undo, conflict handling, and multi-user synchronization. Continuous transforms can remain ephemeral presence data rather than durable history.
One coordinate adapter
Centralize unit, axis, handedness, origin, and quaternion conversion in one tested module. Backend frames, geographic frames, engine worlds, and XR tracking spaces should form an explicit transform chain. Recenter or world-origin shift events update the chain rather than rewriting canonical entity coordinates.
Round-trip fixtures should cover position and orientation. A transformation that seems correct near the origin may produce visible errors at scale, especially in georeferenced worlds.
Anchors, assets, and async state
Product anchors are durable records; runtime anchors are session representations. Resolve them through a platform service and show unresolved or degraded states. Never place unresolved content at world origin as though it were valid.
Load metadata and lightweight proxies before heavy assets. Cache immutable versions, cancel work when scope changes, and preserve identity when a model fails. Scene code should tolerate pending, failed, hidden, and unloaded presentations.
Streaming 3D content
Large worlds need catalog, hierarchy, level of detail, payload, and domain layers. Hierarchical tiles select visible detail; glTF assets carry renderable content; a spatial service provides stable feature IDs, search, annotations, and permissions. Do not regenerate an entire city mesh to change one work-order annotation.
Use immutable versions and content hashes for caching. Align backend regions with engine streaming where practical, but keep the schemas decoupled enough to evolve independently.
Testing the integration
Unit-test mapping, coordinate conversion, commands, revisions, caching, and conflict handling without a headset. Use mocked runtime services to simulate missing capabilities, tracking loss, anchor failure, and recentering. Device sessions can then focus on comfort, input, rendering, and real tracking behavior.
Log durable entity ID, frame, revision, runtime capability, asset version, and anchor state in development builds. These fields turn a “floating object” report into a diagnosable problem.
Continue the field guide
Turn Spatial Data Into a Reliable Contract
Use the journal for implementation patterns, standards context, engine integration, and platform-specific design decisions.
Read the Spatial Systems Journal