Splat viewer

A Gaussian splat is a captured scene made of many small coloured, semi-transparent blobs floating in space rather than a mesh of triangles. This page renders one such scene, a synthetic still life, so you can orbit around it and thin out the blobs to see how little geometry is really there. Everything runs in your browser: the bundled scene and any file you drag in are read and drawn locally, and nothing leaves the browser.

WebGL is not available in this browser, so the splat viewer cannot run here. Try a recent version of Chrome, Firefox, Edge or Safari.

Loading the bundled scene…
View
Thin the splats

A fixed random subset of the splats is kept at each setting, so lowering this slider always removes the same splats first rather than reshuffling the scene.

Load your own capture

You can also drag a .splat file straight onto the view above. Files from phone capture apps such as Polycam or Scaniverse work directly; scenes are capped at about 500 000 splats for performance, and larger files are thinned to that cap.

Drag with the mouse, or swipe with one finger, to orbit; scroll the wheel, or pinch with two fingers, to zoom. Click the view first, then use the arrow keys to orbit and the plus and minus keys to zoom.

How it works

Each splat is really a small three-dimensional Gaussian blob: a centre, a size along three local axes, and a rotation. The renderer turns each one into a flat, camera-facing quad shaped like the blob's own silhouette, coloured with its flat colour and fading towards the edge in a Gaussian curve, so a cluster of splats blends into a soft, correctly stretched surface instead of a field of round dots. This needs the maths of "splatting": the three-dimensional Gaussian's shape (built from its scale and rotation) is projected through the camera to a two-dimensional ellipse on screen, and the quad is drawn along that ellipse's own two axes. On hardware where the browser cannot draw many copies of a shape efficiently (instancing), the viewer falls back to plain round dots sized by each splat's largest axis, which keeps the scene readable but loses the stretch of flattened or elongated splats; the status area of "How it works" says nothing when this happens, but flattened splats such as the tabletop will look more speckled than usual. Quads are blended with standard, non-additive alpha blending, and are sorted from back to front by distance from the camera every few frames on the CPU (immediately after the splat count changes, then roughly every 2 frames for a few thousand visible splats down to roughly every 45 frames as the count approaches the 500 000 cap), which keeps overlapping, semi-transparent splats in the right order as you orbit even though the ordering itself only refreshes now and then.

The bundled scene, scene.splat, is a synthetic still life of a sphere, a torus and a cube standing on a plane that acts as a table, built from about 60 000 splats by scripts/build-splat-viewer-data.py using numpy. It was generated by the course team and is released under a CC-BY-4.0 licence. It is not a real capture; drop in a genuine one to see the difference.

The file format is the common 32-byte-per-splat .splat layout: position (x, y, z as float32), scale (x, y, z as float32), colour (r, g, b, a as one byte each) and a rotation quaternion (four bytes), all little-endian. "Thin the splats" keeps a fixed random subset by comparing a per-splat random number, generated once with a fixed seed when a scene loads, against the slider's percentage, so the same splats drop out first every time.