← 全部指南
指南 · 8 分钟

PLY 文件是什么?三种类型、打开方法与转 OBJ

PLY 文件是什么,网格、点云与高斯泼溅三种 PLY 的区别,各自用什么软件打开,PLY 转 OBJ 何时可行,以及 SOG、SPZ 等压缩格式。

01

PLY 文件是什么?

PLY 文件是一种存放三维数据的容器。PLY 是 Polygon File Format(多边形文件格式)的缩写,也叫 Stanford Triangle Format(斯坦福三角形格式)。一个 .ply 文件里可能是三角网格,可能是一堆散点组成的点云,近几年还可能是 3D 高斯泼溅场景。

这种格式诞生于 1990 年代中期的斯坦福计算机图形实验室。按照美国国会图书馆的格式说明,规范由 Greg Turk 于 1994 年在斯坦福期间写成,该项工作由 Marc Levoy 主持,最初用于保存三维激光扫描得到的模型。国会图书馆还提到,他们没有找到此后对该规范的任何更新,所以今天的 PLY 文件遵循的仍是当年的规则。

它的优点和最容易让人困惑的地方都来自这段历史。PLY 足够简单灵活,几乎任何三维软件都能写出一个,但只看扩展名,你很难知道里面到底装了什么。

02

PLY 文件内部:文件头、元素和属性

每个 PLY 文件都以一小段文本文件头开始,即使后面的数据是二进制的。用任意文本编辑器都能看到开头几行。典型的文件头逐行如下:

  • ply,标识这种格式的记号
  • format ascii 1.0,或 binary_little_endian 1.0,或 binary_big_endian 1.0
  • comment 开头的注释行,程序会忽略
  • element vertex 8,表示后面有 8 个名为 vertex 的条目
  • property float x、property float y、property float z,每个顶点保存的数值
  • element face 6 和 property list uchar int vertex_index,表示 6 个面,每个面是一串顶点编号
  • end_header,之后就是数据

整个格式靠两个概念支撑。元素(element)是一类东西,比如顶点或面,并带有数量。属性(property)是该元素每个条目都保存的一个有名字的数值,类型可以是 float、uchar、int 等。

文件头之后的数据要么是 ASCII,也就是可读的文本,要么是二进制。Paul Bourke 那份被广泛引用的参考资料说,ASCII 便于入门,二进制则用于紧凑存储和快速读写。

关键在于,文件可以声明任意属性。这种格式的设计目标之一,就是旧程序遇到不认识的属性时不会出错,直接丢弃即可。正因为如此,高斯泼溅后来才能沿用 PLY。

03

你会遇到的三种 PLY 文件

看一眼文件头,就能知道手里是哪一种。

  • 网格 PLY。有 vertex 和 face 两种元素。面把顶点连成三角形或多边形,形成表面。顶点常带颜色(red、green、blue)或法线。三维扫描仪和摄影测量软件会生成这类文件,例如 COLMAP 的网格就以 PLY 保存。
  • 点云 PLY。只有顶点,没有面,通常带 x、y、z,往往还有 red、green、blue。每个点是一个没有大小的彩色小点。COLMAP 的稠密点云 fused.ply 就是一例。
  • 高斯泼溅 PLY。同样只有 vertex 元素,但每个条目带的属性多得多:缩放、旋转、不透明度,以及一长串颜色系数。每个条目是一小团柔和的色斑,而不是一个点。

快速判断:文件头里出现 face,就是网格;出现 f_dc_0、scale_0、rot_0、opacity 这类名字,就是高斯泼溅;否则多半是普通点云。

04

高斯泼溅 PLY 里存了什么

多数工具沿用的布局,来自 3D Gaussian Splatting 原始论文(Kerbl、Kopanas、Leimkühler、Drettakis,SIGGRAPH 2023)附带的参考实现。它的保存函数为每个高斯写入以下属性,全部是 32 位浮点数:

  • x、y、z:高斯的中心位置。
  • nx、ny、nz:法线。参考代码把它们全部填为零。
  • f_dc_0 到 f_dc_2:基础颜色,以球谐函数的首组系数保存,并不是普通的红绿蓝数值。
  • f_rest_0 到 f_rest_44:默认设置(3 阶)下的另外 45 个球谐系数,描述从不同方向观看时颜色如何变化。
  • opacity:不透明度。
  • scale_0 到 scale_2:沿三个轴的大小。
  • rot_0 到 rot_3:以四元数表示的朝向。

有些数值并不是按显示时的形式保存的。在参考代码里,使用文件时 opacity 要经过 sigmoid 函数,scale 要经过指数函数,所以直接读文件里的原始数字会觉得很奇怪。

默认设置下,每个高斯有 62 个浮点数,即 248 字节。一个包含一百万个高斯的场景,未压缩时约为 248 MB,这就是高斯泼溅 PLY 文件普遍很大的原因。

05

为什么高斯泼溅 PLY 在网格查看器里不对劲或一片空白

用通用三维软件打开高斯泼溅 PLY,结果常常令人失望:稀稀拉拉的一些点,一团灰色的形状,或者看上去什么都没有。文件本身没有问题,是软件只读取了它能理解的部分。

  • 没有面,所以没有可以着色的表面。
  • 没有 red、green、blue 属性。颜色保存在 f_dc 和 f_rest 系数里,网格或点云工具不会去解读。
  • 缩放、旋转和不透明度被忽略,于是每一团柔和、被拉伸的色斑都缩成了一个点。

由于 PLY 允许程序跳过不认识的属性,你不会看到任何报错,只会得到光秃秃的点位置。要看到场景本来的样子,需要一个真正会渲染高斯泼溅的查看器。

06

如何打开 PLY 文件

按手里 PLY 的种类来选工具。

网格和点云 PLY:

  • MeshLab 是一款处理和编辑三维三角网格的开源软件,采用 GPL 3.0 许可证,支持 Windows、macOS 和 Linux。
  • Blender 通过 File > Import > Stanford (.ply) 导入 PLY。手册说明它能读取 ASCII 和二进制文件,并可导入顶点颜色。
  • CloudCompare 是一个采用 GPL 许可证的免费项目,可在 Windows、macOS 和 Linux 上运行。它的文档把 PLY 列为可读可写的格式,点云或网格均可。

高斯泼溅 PLY:

  • SuperSplat 来自 PlayCanvas,是免费开源的编辑器,用于查看、编辑、优化和发布 3D 高斯泼溅。它在浏览器里运行,无需安装。
  • splatloom.com/ply-viewer 的免费查看器可以在浏览器里打开高斯泼溅的 .ply 和 .sog 文件。文件在本地读取,不会上传。它不显示普通的点云或网格 PLY,这两类请用上面的工具。
07

PLY 转 OBJ:什么时候可行,什么时候不行

OBJ 是一种支持广泛的网格格式,所以经常有人想把 PLY 转成 OBJ。

网格 PLY 转起来很直接。MeshLab 把 PLY 和 OBJ 都列在可打开、可保存的格式里,CloudCompare 的文档也把两者列为可读可写的格式。打开 PLY,再导出或另存为 OBJ 即可。

点云 PLY 在生成表面之前无从转换。点没有面,所以要先做一步网格化,用这些点构建出表面。

高斯泼溅 PLY 则不存在简单的转换。OBJ 描述的是由面组成的表面,而高斯场景根本没有表面:它由互相重叠的半透明色斑组成,颜色还会随观看方向变化。你可以只保留中心点,但那样就丢掉了让场景看起来真实的全部信息。从高斯泼溅得到网格是一个重建问题,而不是文件转换。如果你真正需要的是可打印、可编辑的网格,应该从能输出网格的摄影测量流程开始,例如 COLMAP 的稠密流程最后就是 Poisson 或 Delaunay 网格化。

08

值得了解的压缩格式:SOG 和 SPZ

高斯泼溅 PLY 文件很大,于是出现了更小、便于分享和网页使用的格式。有两种值得了解。

  • SOG 全称 Spatially Ordered Gaussians,由 PlayCanvas 提供文档。它把高斯数据存成一组 WebP 图像加一个 meta.json 文件,也可以打包成一个基于 ZIP 的 .sog 文件。规范写明它在设计上就是有损的,因为数值经过量化,通常比同等的 PLY 小 15 到 20 倍左右。
  • SPZ 是 Niantic Labs 以 MIT 许可证开源的压缩高斯泼溅格式。它的文档说,SPZ 文件通常比对应的 PLY 小 10 倍左右,视觉差异很小。

两者都是靠用更少的位数保存每个数值来节省空间。PlayCanvas 把 PLY 称为高斯泼溅工作流里的源格式,就像工程文件之于修好的图片;它的命令行工具 SplatTransform 可以在 PLY、SOG 和 SPZ 之间转换。比较稳妥的做法是把原始 PLY 留作母版,需要分享时再从它生成压缩版本。

09

自己生成高斯泼溅 PLY

如果你想用自己的照片或视频生成高斯泼溅 PLY,又不想去搭建研究代码,SplatLoom 就是为此做的。它是一款面向 Mac(Apple Silicon,macOS 15 及以上)和 Windows 10/11 的桌面应用,在你自己的电脑上生成场景,可以用裁剪和框选工具整理,并导出高斯 PLY,以及 PNG 静帧、MP4 环绕视频和可离线打开的独立 HTML 查看器。

有一点要说清楚:SplatLoom 不导出网格,也不是测量或 CAD 工具。需要 OBJ 文件、3D 打印或精确尺寸时,能输出网格的摄影测量软件是更合适的选择。如果只是想看看别人发来的高斯泼溅 PLY,用 splatloom.com/ply-viewer 的免费浏览器查看器就够了。

常见问题

怎么打开 PLY 文件?

要看里面是什么。网格和点云 PLY 用 MeshLab、Blender 或 CloudCompare 打开;高斯泼溅 PLY 用 SuperSplat 或 splatloom.com/ply-viewer 的免费浏览器查看器这类专门的查看器打开。

能用文本编辑器查看 PLY 文件吗?

文件头总是可以看的,它是纯文本,列出了元素和属性。end_header 之后的数据只有在文件以 ASCII 保存时才可读,二进制文件会显示成乱码。

高斯泼溅 PLY 能转成 OBJ 吗?

不能直接转。OBJ 保存的是由面组成的表面,而高斯泼溅没有面,只有柔和的半透明色斑。要从中得到网格,需要单独做一步表面重建,所以需要网格时,通常直接使用能输出网格的摄影测量软件更好。

为什么我的高斯泼溅 PLY 这么大?

参考格式在默认设置下为每个高斯保存 62 个浮点数,约 248 字节,而且没有压缩。一百万个高斯大约是 248 MB。SOG、SPZ 这类格式通过量化数值,能把体积明显缩小。

PLY 和 OBJ、STL 是一回事吗?

不是,它们是不同的格式。PLY 可以描述网格、点云以及自定义的逐点数据,这也是高斯泼溅选用它的原因。MeshLab 这类工具能打开并保存 PLY、OBJ 和 STL,所以网格文件可以在它们之间转换。

参考资料:https://www.loc.gov/preservation/digital/formats/fdd/fdd000501.shtml · https://paulbourke.net/dataformats/ply/ · https://github.com/graphdeco-inria/gaussian-splatting · https://raw.githubusercontent.com/graphdeco-inria/gaussian-splatting/main/scene/gaussian_model.py · https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ · https://developer.playcanvas.com/user-manual/gaussian-splatting/formats/ply/ · https://developer.playcanvas.com/user-manual/gaussian-splatting/formats/sog/ · https://github.com/playcanvas/splat-transform · https://github.com/playcanvas/supersplat · https://github.com/nianticlabs/spz · https://www.meshlab.net/ · https://github.com/cnr-isti-vclab/meshlab · https://docs.blender.org/manual/en/latest/files/import_export/ply.html · https://www.cloudcompare.org/main.html · https://www.cloudcompare.org/doc/wiki/index.php/FILE_I/O · https://colmap.github.io/tutorial.html

在 SplatLoom 中试试