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,压缩更强、加载更快,且引擎原生支持。