Skip to content

interactive layer · v1 — collision shipped

Splat Patching

Out of the box, a Gaussian splat is something you can only look at. Patching is the set of techniques that turn it into a stage a game engine can act on — collision, composition, deformation, occlusion. The bet that makes the photoreal interactive.

what it is

Captures used to be scenery.

Splat Patching is the layer of PAXAL that turns a captured scene into a game-world primitive. A renderer can paint a splat. A patched splat can also stop a wheel, register a dent, host a hinged door, and accept a composited prop. The capture stays the capture — the photoreal pixels are not touched. Patching is what the engine attaches around them so gameplay code has something to hold on to.

why it exists

A splat is appearance, not a world.

A 3D Gaussian splat is point-based, view-dependent appearance. Millions of fuzzy ellipsoids tinted by spherical harmonics. The renderer projects and blends them into pixels — beautifully — but there is no surface inside the file. No triangle a ray can hit. No vertex a constraint can bind to. Without patching, every drivable splat scene needs a parallel hand-modelled mesh, and the entire reason for capturing the world has just been undone.

Patching is the discipline of deriving the missing world from the capture itself — and keeping the two in sync as both evolve.

the four primitives

One layer shipped. Three research lines.

Patching is not a single technique; it is a family. PAXAL treats it as four distinct primitives that share a pipeline but solve different problems. The order matters — collision earns the rest.

collisionwalls that stop you, floor that holds youlive
compositionprops and NPC splats that drop into a sceneresearch
deformationa wall takes a dent, a fender foldsresearch
occlusiona closed door blocks a sightlineresearch

The page is honest about what is shipped. Composition, deformation, and occlusion are real research lines with parked tickets — not announcements.

the collision layer

A parallel mesh, extracted from the splat.

The shipped pipeline turns a Gaussian-splat capture into a watertight triangle mesh the physics layer can collide against. Three stages:

capture/room.compressed.ply
   │
   │  splat-transform … --filter-cluster --voxel-carve -K
   ▼
public/arena/room.collision.glb       (watertight triangle mesh)
   │
   │  loaded as trimesh collider at runtime
   ▼
physics:  walls-only trimesh  +  flat plane @ floorY = -3.8
spawn:    [ -2, -1, -1.4 ]

For the room arena specifically: the mesh is partitioned into a walls-only trimesh and a flat ground plane pinned at floorY = -3.8, with the vehicle spawning at [-2, -1, -1.4]. The vehicle drives smoothly; the walls stop you. The hybrid — concave trimesh for walls, infinite plane for floor — is portable to any captured interior with a single dominant ground level.

what this unlocks

The first thing a captured world can do.

Once a splat scene has a collider, the rest of a game engine has somewhere to land. Vehicle physics runs against real-world capture, not against a hand-modelled stand-in. Doors get to hinge. Walls get to take damage. Props can be composited in at runtime and dropped onto a real floor. NPCs with their own colliders can stand inside the same space the camera was. The first proof point is the driving demo on the play route — a real scanned room, a vehicle that obeys it.

the hard part

Splats don't have a topology to bolt to.

Patching is harder than it sounds because a Gaussian-splat scene has no vertex-and-triangle topology to attach constraints to. A hinge wants two rigid bodies and a pivot; a splat is a fuzzy ellipsoid with a colour and an opacity. The collision-mesh pipeline sidesteps the problem by extracting a parallel triangle mesh from the splat geometry and binding all physics to that. The splat renders; the mesh collides; the two are coupled by sharing a coordinate frame.

The remaining primitives can't cheat that cleanly. Deformation wants the splat parameters themselves to change when a wall is hit — opacity, scale, colour, per-splat — without ruining the appearance. Occlusion wants the engine to query a depth buffer the splat renderer wrote. Both are open research lines, not wishlist items, but neither is shipped today.

what's shipped

v1 — collision only, in product voice.

  • 01Collision-mesh extraction. A splat-transform pass with cluster filtering and voxel carving emits a watertight .collision.glb alongside each compressed splat — the same step that ships the LOD ladder.
  • 02Runtime trimesh collider. The GLB is loaded as a concave trimesh and registered with the physics world; the renderer never sees it. The room arena ships with a walls-only trimesh paired with an infinite ground plane.
  • 03Vehicle physics on real captured geometry. Driving, braking, and wall contact all resolve against the extracted mesh, not a hand-modelled stand-in. The driving demo on /play is the live proof point.

what's next

Composition, then deformation, then occlusion.

The next primitive is composition — parked-vehicle and NPC splats with their own colliders, dropped into a host scene at runtime. The engineering exists; the bottleneck is content. After that, deformation: per-splat dent maps that let geometry register impact without breaking the appearance. Then occlusion: an engine query against the depth buffer the splat renderer already writes, so the AI and the audio system can reason about line-of-sight. No dates; the order is the commitment.

Streaming makes the photoreal deliverable. Patching makes it interactive. The driving demo is what happens when both land in the same browser tab.

Drive a real space →