Introduction
SPZ is a compressed format for Gaussian splat scenes from Niantic, published as open source in 2024. Niantic’s Scaniverse app saves scenes in it. It stores the same splats as the 3D Gaussian Splatting PLY in roughly a tenth of the space: each value is quantised to a few bits, the values are grouped attribute by attribute so that like is next to like, and the result is compressed.
Versions 1 to 3 compress everything with gzip. Version 4 keeps a small header in the clear and compresses each attribute with Zstandard on its own, so that they can be decompressed in parallel.
Structure
A file of versions 1 to 3 is a gzip file. Decompressed, it is a 16-byte header, then each attribute for all the splats in turn.
0HeaderNGSP, version, number of splats, harmonics degree, fractional bits, flags16 bytes16Positions x, y, z: 24-bit fixed point (half floats in version 1)9 bytes a splat…Alphas opacity1 byte a splat…Colours red, green, blue3 bytes a splat…Scales log scale on each axis3 bytes a splat…Rotations quaternion: x, y, z, or smallest three from version 33 or 4 bytes a splat…Spherical harmonics a byte a coefficient, when the degree is 1 or more9, 24, 45 or 72 bytes a splat
A version 4 file starts with the bytes NGSP itself, not with gzip’s
1F 8B.
In this reference
- Header and attributes – the 16-byte header and every attribute byte by byte, for versions 1 to 3, how each becomes part of a Gaussian, and version 4’s header and streams
Links
Software
- Scaniverse – Niantic’s 3D scanning app, which saves splat scenes as .spz (iOS, Android)
- SuperSplat – PlayCanvas’s free open source splat editor (web)
Developers
- spz – Niantic’s library that reads and writes the format and converts from PLY (C++)
- splat-transform – converts between splat formats, .spz among them (JavaScript)
Reference
- spz README – Niantic’s description of the format and its versions