splats4D:一种可流式传输的 4D 高斯点云格式
splats4D:一种可流式传输的 4D 高斯点云格式
概述
splats4D 是一种新颖的 4D 高斯点云(Gaussian splatting)格式,旨在实现对动态图形 3D 场景的高效压缩与流式传输。它的压缩比在 16–58 倍(相对于原始数据)以及 14–20 倍(相对于 gzip)之间,编码速度约为 640 MB/s。该格式专为通过对象存储(如 S3、GCS 或 R2)使用 HTTP Range 请求进行交付而设计,能够实现瞬时首帧渲染和快速定位,无需服务器端逻辑或清单文件。
压缩架构
.splat4d 格式通过将静态和动态元素分离并采用时间增量编码策略来减小文件体积。
静态与动态划分
为了最小化冗余,格式会将点云(splats)标记为静态——如果单一量化值在整个剪辑中满足用户定义的误差界限。这些静态点云只存储一次,这意味着即使剪辑很长,整个序列的背景也可以压缩到几兆字节。
死区 “保持” 轨道
为防止量化闪烁并降低时间增量,点云使用一种 “保持” 机制。只有当实际值相对于当前已存值超出用户定义的界限时,存储的值才会改变。这确保了时间增量大多数情况下为零,并在每个发出的符号之前严格保证精度。
GOP 结构与定位
借鉴 H.265,格式使用闭合的图像组(GOP)。关键帧(绝对量化值)每 N 帧存储一次,随后是由精确整数增量组成的 P 帧。由于每个 GOP 块可以独立解码,定位时无需处理前面的块。关键流位于每块的增量流之前,客户端只需获取块的前约 10% 即可瞬时显示关键帧。
熵堆栈
最终的压缩流水线使用 Morton 排序的点云、Zigzag 编码的整数增量、类似 Blosc 的字节平面洗牌以及每条流的 zstd 压缩。此过程使输出大小接近符号流的 0 阶熵。
确定性误差界限
不同于依赖 PSNR 或平均误差的格式,splats4D 使用 SZ/ZFP 风格的误差有界量化。这保证了每帧中每个点云的每个属性都严格位于源数据的点对点界限内。
| 属性 | 界限 | 默认 |
|---|---|---|
| 位置 | ± 毫米,按轴的 Lⁿ | ±2 mm |
| 颜色 RGB | ± 8 位级别/通道 | ±4/255 |
| 不透明度 | ± 8 位级别 | ±4/255 |
| 旋转 | ± 四元数分量 | 精确 (±0) |
| 缩放 | ± 相对 %,按轴 | ±2% |
流式传输与对象存储集成
该格式专为普通 HTTP Range 请求设计。客户端可以通过少量有针对性的获取来渲染场景:
- Header:获取前 256 KB 以读取魔数和包含字节偏移的 header JSON。
- Static Section:获取静态点云以渲染完整的首帧视图。
- GOP Chunks:在播放或预取期间获取相应的 GOP 块。
- Seeking:获取块前缀范围,以约 100–150 ms 显示关键帧。
性能基准
在包括 Dynamic 3D Gaussians 与 Neu3D 在内的八个序列中,splats4D 始终优于通用压缩。举例来说,一个 2 秒的 “flame” 场景从 427 MB(原始)压缩至 18.5 MB,压缩率为 23.2×。
| 序列 | 帧 × 点云数 | 原始大小 | Gzip 大小 | splat4d 大小 |
|---|---|---|---|---|
| Birthday | 40 × 659k | 844 MB | 724 MB | 40.7 MB (20.7×) |
| Boxes | 40 × 351k | 450 MB | 423 MB | 27.2 MB (16.5×) |
| Flame | 40 Ó 334k | 427 MB | 367 MB | 18.5 MB (23.2×) |
| Juggle | 150 Ó 337k | 1616 MB | 1515 MB | 83.4 MB (19.4×) |
| Sear | 40 Ó 109k | 16.9× | 8.2 MB | |
| Softball | 40 Ó 336k | 430 MB | 404 MB | 25.9 MB (16.6×) |
| Tennis | 40 Ó 333k | 426 MB | 401 MB | 26.2 MB (16.3×) |
实现
该项目采用 MIT 许可证,并提供一个 Python 包(pip install splats4d)用于将 .splat 帧序列编码为单个 .splat4d 文件。查看器是 antimatter15/splat 渲染器的移植,支持 WebGPU 并提供 WebGL2 回退。