Log inGet started

gaussianSplat

A photographic capture of a real place, stored as a cloud of oriented 3D Gaussians rather than as triangles. Drop a .spz or .ply into the world and the importer turns it into one of these.

<name>.gaussianSplat/
  source.spz     the capture — the primary the runtime decodes
  .metadata      count, bounds, SH degree, axis convention
  README.md

Point a GaussianSplat component at one and it draws:

local id = entity.spawn("scan").id
entity(id).component.add("GaussianSplat", { source = "captures/room.gaussianSplat" })

Reading a cloud without decoding it

.metadata carries what a tool needs to reason about a capture — how many splats it holds, the world-space box it occupies, whether it stores view-dependent colour — so framing a camera on a cloud or reporting its cost does not pay for a decode of the whole thing.

{
  "count": 1920000,
  "boundsMin": [-24.48, -0.92, -22.19],
  "boundsMax": [27.52, 33.40, 16.81],
  "shDegree": 0,
  "convention": "rightDownFront",
  "recordBytes": 24
}

boundsMin / boundsMax are the full extent, outliers included. A capture of a whole scene usually carries a sparse halo of stray Gaussians far outside the part anyone looks at, so framing a camera on these bounds puts it outside the scene looking at the halo. For a scene capture, place the camera inside it.

Why the capture stays the primary

The engine's packed record pool is 24 bytes per splat — larger than the .spz the capture arrived in, whose quantized encoding is what makes the format worth using. Baking the pool into the container would spend storage to save a decode that costs a few hundred milliseconds once per load.

Guide

guides { path = "topics/gaussian-splats" } covers capturing, placing, and tuning a cloud.

  • asset-type
  • reference