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.