SplatsThe evolution of media, in brief
RSS

To put splats on the globe, he replaced the renderer

Key art for the plugin: a Gaussian-splat capture of a derelict stone barn with a corrugated roof, sitting on a white tile and surrounded by scattered blue and purple splat points, with the wireframe box of its tile bounds drawn around it

Image: 3D-Tiles-RendererJS-3DGS-Plugin · Tools

Amara Osei

Amara Osei

Aug 28, 2026, 3:35 PM ET-Tools

Two standards have been circling each other for most of a year. Khronos defined how a Gaussian splat lives inside a glTF file; the OGC's 3D Tiles defines how you stream a planet's worth of glTF to a browser. A plugin published this morning puts them together, and the interesting part is what its maintainer had to throw away to do it.

Why it matters: 3D Tiles is how large geospatial scenes actually get delivered — a spatial hierarchy of tiles, fetched on demand, disposed when they leave view. It is the format behind most serious terrain and city streaming on the web, and `3d-tiles-renderer`, maintained under NASA-AMMOS, is its three.js implementation.

Until now splats have mostly arrived as single monolithic files: one capture, one scene, load it all. Making a splat a tile payload means it inherits everything the tiling ecosystem already knows how to do — hierarchical refinement, memory accounting, disposal, fading between levels — and it means a splat capture can sit on a globe next to terrain and photogrammetry rather than in its own viewer.

The plugin reads glTF tiles carrying `KHR_gaussian_splatting` compressed with `KHR_gaussian_splatting_compression_spz_2`. That is Khronos's splat extension and Niantic's SPZ codec, arriving inside an OGC transport, which is about as much standards-stack composition as this field has managed so far.

What changed today: Version 0.2.0 replaced `@sparkjsdev/spark` — World Labs' widely used three.js splat renderer — with `gaussian-splat-lite`, a renderer the same author wrote. The stated reasons are native large-coordinate precision, faster sorting, and faster and more accurate raycasting, at similar CPU and GPU memory cost.

The precision point is the substantive one, and it is a problem geospatial developers will recognise immediately. Earth-centred, Earth-fixed coordinates put every object several million metres from the origin. At that magnitude single-precision floats quantise to something like half a metre, so geometry jitters as the camera moves. The standard fix is to render relative to the camera rather than the origin, and a splat renderer built for object-scale captures has no particular reason to do that. One built for the globe has to.

The rest of 0.2.0 is architectural: applications now own the lifecycle of the scene-level renderer instead of the plugin owning it, and splat tiles construct meshes directly from SPZ bytes. It is a breaking change and ships with a migration guide. A follow-up hours later fixed splat tiles losing sync when an ancestor transform changed.

Yes, but: This is one developer's project. The plugin has 120 stars and 17 forks — real traction for a single-maintainer library, and nothing like an institutional commitment. The renderer it now depends on is days old and effectively unknown, which trades a mature dependency for one with a single set of eyes on it.

The precision rationale is the maintainer's own, stated in a changelog. It is technically coherent and matches a well-documented problem, but nobody has published a comparison showing Spark failing at ECEF scale, and I have not measured one.

The supported surface is also narrow by design. Tiles must be glTF or GLB, must carry `KHR_gaussian_splatting`, and must use SPZ v2 compression — raw Gaussians and other compression schemes are simply not handled. That is a reasonable line for a small project to draw, and it means the plugin only works on content produced by a fairly specific pipeline.

The big picture: The week's pattern is browser stacks discovering that splats need the same infrastructure everything else already has. luma.gl added out-of-core paging with a residency budget; Babylon.js added a render budget and multi-camera LOD; this adds tiling and disposal by inheriting them wholesale from a geospatial standard.

The recurring lesson is that the general-purpose splat renderers are object-scale tools. Every project that tries to put a capture somewhere real — a city, a survey, a globe — ends up either extending one or, as here, writing its own.

Go deeper:

  • 3d-tiles-rendererjs-3dgs-plugin on npm
  • The plugin on GitHub
  • 3DTilesRendererJS, maintained under NASA-AMMOS
⟵ Back to the brief

More stories

The base of a Gaussian-splat capture of a pasta box shown twice. Above, the shadow beside it breaks into a hard blocky wedge, circled in red by the developer. Below, after the fix, the same shadow falls away as a smooth gradient

Babylon.js gave splats a hard ceiling

2 hours ago

The same view of a white bicycle leaning against a black bench on grass, rendered twice side by side — once from the uncompressed reconstruction and once from the compressed one — with no visible difference between them

738 MB to 3.2 MB, without touching the training loop

3 hours ago

Three pairs of suburban street scenes from a car's forward camera, each pair showing the ground-truth future frame beside 4DGS-WAM's prediction of it at a different horizon

A driving world model that only predicts the parts that move

3 hours ago

A figure summarising the study: five systems and four water regimes across the top, a row of murky underwater renderings of a submerged structure, and beneath them two Gaussian point clouds of a sunken car — one coherent and car-shaped labelled 3DGS, one scattered and diffuse labelled SeaSplat, each captioned with its PSNR and chamfer error

The water got murkier and the scores went up

Yesterday

splats

Short daily briefs on the evolution of media — gaussian splats, volumetric video, dome theaters, headsets, and the research underneath.

Newsroom

  • Latest
  • All stories
  • RSS feed
© 2026 Splats · Terms · Privacy