back to index

digital twins for remote training

A global pharmaceutical company needed to onboard new employees at their UK production facility. COVID lockdowns made that impossible. New hires couldn't build the spatial familiarity that makes people effective in a complex manufacturing environment. The company needed a digital twin that multiple people could explore together in VR.

This became Ravel's founding use case. We later built digital twins for a Dutch water authority and an urban innovation hub. Each project refined the same core pipeline: physical building in, navigable multiplayer VR space out.

The pipeline

Each stage is independently replaceable. The boundary between stages is always a file or an API call, never shared state.

Source geometry

A digital twin prioritizes spatial recognition over geometric accuracy. The person walking through the VR version needs to think "yes, this is the lab I work in." Textures and lighting matter more than millimeter precision on pipe diameters. We combined photogrammetry for visual fidelity with simplified CAD geometry for interactive elements. The building looks photorealistic, but the equipment you interact with is clean geometry with metadata attached.

Unity scene construction

Each facility becomes a Unity scene organized by zone. Zones load as separate sections, keeping memory manageable on standalone VR headsets. Interactive elements sit on top of the base environment. Equipment gets annotated with specs, operational parameters, safety information. These annotations live in a JSON structure stored as dynamicContent on the environment entity.

The scene gets exported as a Unity asset bundle. One bundle per target platform: Quest, PC VR, WebGL. Same source scene, different compression and quality settings per platform.

Environment delivery

Creators upload bundles through a dedicated environment service API. The bundle goes to S3, tracked via a CloudFront distribution URL for low-latency delivery. The service enforces a 180MB cap per bundle to keep load times reasonable.

@URL
@Column(name = "asset_bundle_url", length = 500)
private String assetBundleUrl;

New environments go through QA review before publication. Only approved environments can be assigned to spaces. This gate prevents broken or oversized bundles from reaching users. When a bundle updates, the service invalidates the specific CloudFront distribution path.

Spaces and sessions

An environment is a place. A space is an instance of that place with its own configuration, access controls, and persistent state. One facility environment might back three spaces: training, onboarding, and maintenance reference. Each has different permissions and interactive content enabled.

When a user enters a space, the backend provides connection details for Photon (networking) and Agora (voice) in a single call:

@GetMapping(value = "/sessions/{userUuid}/{spaceProCode}")
public ResponseEntity<Object> getSessionDetails(
    @PathVariable UUID userUuid,
    @PathVariable String spaceProCode
) {
    return ResponseEntity.ok()
        .body(spaceProService.getSessionDetails(userUuid, spaceProCode));
}

State updates flow through Photon and persist to the database on room close. When users rejoin, the room picks up where it left off.

What made it work

Trainers could stand next to a new hire in VR, point at actual equipment, and explain procedures. The spatial relationship between equipment mattered. Understanding that the gowning room is here, the clean room airlock is there, and the bioreactors are arranged in this layout is knowledge that slides and videos cannot convey.

The water authority project confirmed the pattern. New employees needed to understand which mechanical systems served which zones across multiple floors. A digital twin gave them the spatial mental model before they ever entered the building.

Trade-offs

Asset bundles are opaque binaries. You cannot patch a single texture without rebuilding the entire bundle. We accepted this because bundles load atomically: no partial states, no version mismatches between assets.

The 180MB cap forced discipline on scene complexity. Completeness is the enemy of usability in VR where frame rate directly affects comfort. Photon's state persistence saved as a single JSON blob on room close, so crashed sessions lost intermediate state. Acceptable for training. Not for collaborative design.

A digital twin replaces reality entirely, which raises the bar on visual quality but removes the constraint of camera-feed integration.

I was Technical Director and co-founder at Ravel from 2021 to October 2022.