跳到主要内容

SPZ 格式

SPZ 是 Niantic 的开源压缩格式,以 ZSTD 压缩流保存量化属性,体积约为 PLY 十分之一,视觉损失几乎难以察觉,是 Scaniverse 等应用的原生格式。

可用 SplatTransform 创建,再由 PlayCanvas 配合解析脚本加载。

创建 SPZ​

用 SplatTransform 转换支持的格式:

splat-transform scene.ply scene.spz

默认写出 SPZ v4,引擎解析器支持 v3 和 v4。

在 PlayCanvas 中加载​

解析器不在引擎核心中,而作为随引擎提供的 scripts/esm/parsers/spz-parser.mjs 脚本,由应用注册到 gsplat 资源处理器。

v4 属性流使用 ZSTD,还需注册 ZSTD WebAssembly 解压模块,引擎仓库有预构建版本。v3 整文件 gzip 压缩,无需模块。

import { SpzParser } from 'playcanvas/scripts/esm/parsers/spz-parser.mjs';

// version 4 attribute streams are ZSTD compressed - register a decoder module
pc.WasmModule.setConfig('ZstdDecoderModule', {
glueUrl: 'zstd.wasm.js',
wasmUrl: 'zstd.wasm.wasm'
});

// register the spz parser with the gsplat resource handler
app.loader.getHandler('gsplat').addParser(new SpzParser(app));

// spz files then load as regular gsplat assets
const asset = new pc.Asset('scene', 'gsplat', { url: 'scene.spz' });
app.assets.add(asset);
app.assets.load(asset);

完整配置见 simple-spz 示例。

引擎支持说明​

  • 支持 v3 和 v4。拒绝 v1、v2,可用 SplatTransform 重新转换。
  • XGRIDS LCC2 可用 SPZ 分块,通常为 v3。注册解析器后,按 .spz 扩展名请求,正常流式加载。
  • GPU 内保留量化数据,每单元约 20 字节加球谐,在着色器反量化,因此显存接近压缩 PLY 和 SOG,而非未压缩格式。
  • 支持最高三阶球谐,四阶文件会忽略额外一阶。
  • 坐标系:+Y 向上,与 glTF 一样,无需 PLY 的翻转旋转。
  • antialiased 标志设置资源的 antiAlias,参见抗锯齿。忽略厂商扩展。

何时使用 SPZ​

已有 SPZ 资源时适合直接使用,例如 Scaniverse 扫描或 Niantic 生态工具输出。

提示

Web 交付仍推荐 SOG,压缩更强、加载更快,且引擎原生支持。