BimAnt 3DGS
3DGS · 高斯泼溅

PLY 转 Compressed PLY

仍然是 PLY 容器,只是字段被量化、按块组织。好处是很多工具“以为自己在读 PLY”,于是不用改代码就能吃下更小的文件。

没有文件?试一个 →

支持 .ply .splat .ksplat .spz .sog .compressed.ply · 文件不会离开你的电脑

PlayCanvas 项目为什么用 Compressed PLY

Compressed PLY 的文件头仍然是 ASCII 的 ply,但顶点字段被换成 packed_position、packed_rotation、packed_scale 之类的整数,并按 chunk 存边界值。读取器只要支持这套字段布局,就能继续用 PLY 的加载路径。

这就是它的好处:不引入新扩展名,不要求下游换 loader,文件却比原始 PLY 小。

  • 输入:PLY、SPZ、SPLAT、KSPLAT、SOG、Compressed PLY
  • 输出:Compressed PLY(二进制小端,带 chunk 与 packed 属性)
  • 注意:普通 PLY 读取器可能把它当损坏文件;要读它得支持压缩 PLY 的字段布局

体积算例:10 万点约 6 MB(视量化)

10 万点、SH 3 阶的 PLY 约 24.8 MB(100,000 × 248 字节)。按我们 1,432 点小样本的实测,Compressed PLY 约是 PLY 的 0.25 倍;10 万点粗估 6 MB 左右,但量化参数与 chunk 大小会显著改变结果。

不要把它当“固定的 1/4 压缩”:它是有损量化,压缩设置由生成端决定;本页只给粗估,实际以转换结果为准。

谁在读它

PlayCanvas 生态与部分 SuperSplat 版本支持 Compressed PLY;three.js r187 没有对应的 splat loader,所以本工具查看它时先在 Worker 里转成 SPZ,再交给 three.js 渲染。

如果对方指定要 Compressed PLY,就转它;如果只是想在网页里看,SPZ 更通用。

常见报错:普通 PLY 查看器打不开

普通 PLY 查看器只认 float 的 x/y/z 和颜色字段,看到 packed_position 会直接报“缺少属性”或“文件损坏”。这不是文件坏了,是读取器不认压缩布局。

用支持 Compressed PLY 的工具打开,或者先用本工具转回普通 PLY;不要手工改扩展名。

怎么验证输出没问题

把 .compressed.ply 再拖回本页,能出画面、点数与源文件一致,说明 chunk 与 packed 字段可读。

再转回 PLY 比较点数与包围盒;如果目标项目用 PlayCanvas,最好在那边也打开一次,避免“本工具能读、对方读不了”。

Compressed PLY 适合谁,不适合谁

适合:PlayCanvas 项目、对方明确要求 Compressed PLY、或者你希望“仍然是 PLY 容器”但文件更小。它不需要下游换扩展名,只要支持 packed 字段即可。

不适合:普通 PLY 查看器、需要无损、需要跨工具通用。它的量化是有损的,压缩设置由生成端决定,体积没有 SPZ 那种稳定口径。

  • 适合:PlayCanvas、指定 Compressed PLY 的下游
  • 不适合:普通 PLY 工具、无损存档、跨工具交换
  • 注意:查看它需要支持 packed/chunk 字段的 loader

和 SPZ / 普通 PLY 的取舍

SPZ 是跨工具格式,three.js / SuperSplat / Niantic 工具链都认;Compressed PLY 主要服务 PlayCanvas 生态,离开支持 packed 字段的读取器就不通用。

Compressed PLY 的 chunk 大小和量化参数由生成端决定,同一份点云可能出现明显不同的体积;我们给的 0.25 倍只来自一个 1,432 点小样本,不是保证值。

普通 PLY 保真、体积大;Compressed PLY 按我们的小样本实测约为 PLY 的 0.25 倍,但这是量化结果,换参数就会变。10 万点粗估 6 MB,不是固定值。

不要手工把 .ply 改成 .compressed.ply:文件头里的字段布局没变,读取器仍然会失败。格式是写出来的,不是改后缀改出来的。它依赖 packed_position、packed_rotation、packed_scale 这些字段,以及 element chunk 的边界值;普通 PLY 没有这些。如果拿到的是别人给的 Compressed PLY,先用支持它的工具确认能打开,再决定要不要转回普通 PLY。如果目标工具没有明确要求 Compressed PLY,优先 SPZ 或普通 PLY。不要只看体积,先确认下游能读;能读比更小重要。先拿小样本试,不要一上来就转大文件。

如果下游是 PlayCanvas 或明确要求 Compressed PLY,选它;否则 SPZ 更稳。

  • PlayCanvas、指定 Compressed PLY:Compressed PLY
  • 跨工具、网页:SPZ
  • 存档、继续编辑:普通 PLY
  • 极限体积:SOG(但慢)

手把手:从 PLY 转 Compressed PLY

  • 把 PLY(或其它支持格式)拖进画布
  • 点「⇩ 转换」,目标已经预选为 Compressed PLY
  • 开始转换并下载 .compressed.ply
  • 把文件拖回本页,确认 chunk 与 packed 字段可读
  • 如果目标项目用 PlayCanvas,在那边再打开一次

替代方案:SPZ 还是 Compressed PLY

跨工具分发优先 SPZ:体积更稳定、loader 更多、three.js 原生支持。只有在对方指定 Compressed PLY,或你的管线已经按 PlayCanvas 的字段布局读取时,才选它。

不要把扩展名从 .ply 手工改成 .compressed.ply:文件头里的字段没有变,读取器仍然会失败。格式是写出来的,不是改后缀改出来的。

常见问题

为什么查看 Compressed PLY 要先转一次?

three.js 自带的 4 个 splat loader 里没有 Compressed PLY。本工具用已经装好的格式转换把它在浏览器内转成 SPZ,再交给 three.js 渲染;文件仍然不上传。

Compressed PLY 和 SPZ 哪个通用?

SPZ 的跨工具兼容性更好,体积也更稳定(约 PLY 的 1/10)。Compressed PLY 主要服务 PlayCanvas 生态,属于“对方指定要它”时再转的格式。

Compressed PLY 是无损的吗?

不是。位置、旋转、尺度、颜色都被量化过;它只是保持了 PLY 容器,读取器不用换扩展名,不代表数据没损失。

为什么同一份 PLY 转出的 Compressed PLY 大小不一样?

量化参数和 chunk 大小会改变输出;不同版本或不同工具生成的 Compressed PLY 不能直接比体积。

转换格式

选一个目标格式。转换在浏览器里完成,文件不上传。

目标格式