← Lab bench
EXP-056Live

A 3D scene that streams like video: first view in half a second

0.5s

to the first 3D view on a simulated 20 Mbit/s connection, against 5.6 s to download the whole scene first

The factory robot cell rendered from the smallest streamed version, sparse and blurry, and from the full scene (Full: 1M Gaussians, 14 MB)The factory robot cell rendered from the smallest streamed version, sparse and blurry, and from the full scene (T0: 100k Gaussians, 1.2 MB)
◂▸
T0: 100k Gaussians, 1.2 MBFull: 1M Gaussians, 14 MB

Inspired by Nokia's IBC 2026 demo of streaming Gaussian splats over DASH, we cut one of our own splat scenes into a quality ladder, from 1.2 MB to 14 MB, with a manifest like a video stream's. The browser shows the smallest version at once, measures the connection, and swaps in sharper versions as they arrive.

What we tried

  • Rendered 160 views of our factory robot cell with exact cameras and trained a Gaussian splat in LichtFeld Studio.
  • Ranked every Gaussian, cut a four-rung ladder and compressed each rung to SOG, with a small manifest.
  • Built a browser player on Spark that starts small, measures throughput and picks the next rung that can arrive in about 5 seconds.
  • Scored every rung against the full scene from six fixed viewpoints, in the same renderer visitors use.

What we measured

MeasureDownload the whole sceneStream the ladderNote
First 3D view, 20 Mbit/s5.6 s0.5 s
First 3D view, 5 Mbit/sabout 22 s1.9 sSettles on the 300k version at 7.4 s
Match to full scene, T0 · T1 · T2—13.9 · 19.7 · 35.1 dBPSNR over six viewpoints
Ladder sizes—1.2 · 3.3 · 13.0 · 14.0 MB
Full colour detail costs—+1 MBSpherical harmonics degree 3 against 1, in SOG

What went wrong

  • Our first ladder pruned a 5-million-Gaussian model. Ranking by opacity × size kept big faint blobs (haze) and dropped the small opaque ones that make surfaces: the 1M rung scored only 16 dB against the full scene.
  • Ranking by pixels covered across the training cameras helped (18 dB), but the real fix was training the scene with a 1-million cap, so the top rung is the whole model.
  • LichtFeld Studio writes SPZ version 4, which Spark can't read yet, so we switched to SOG, which is also 37% smaller.
  • Our first quality numbers were nonsense (100 dB and 1 dB side by side) because the page's own animation loop kept moving the camera between captures. We stopped it before measuring.

What happens next

  • Additive streaming, where each rung adds Gaussians instead of replacing the last.
  • Moving splats: per-segment 4D Gaussians on the same ladder, towards what Nokia showed.
  • Our own capture instead of a rendered scene.

Built with

  • LichtFeld Studio (training, SOG export) GPL-3.0
  • Spark 2.2 MIT
  • three.js MIT
  • Blender (test scene) GPL