用户指南

第 8 章 — 导出格式

简单模式下的导出格式选择 — 六个格式卡片:PLY、SPZ、glTF、.splat、Orbit Video、Web Viewer
简单模式下的导出格式选择 — 六个格式卡片(PLY、 SPZ、glTF、.splat、Orbit Video、Web Viewer)。专家模式 以更密集的网格显示相同的选择,并提供更多目标格式。
带有格式网格的导出区域 — 九个带大小信息的卡片:PLY 2.2 MB(已选中)、cPLY 142 KB、SOG 89 KB、SPZ 216 KB、glTF 2.1 MB、.splat 279 KB、Video Zero KB、Wiggle Zero KB、Web 378 KB;下方是「Export PLY (3DGS Standard)」按钮和「Upload to SuperSplat…」
带有格式网格的导出区域 — 九个带大小信息的卡片:PLY 2.2 MB (已选中,蓝色边框)、cPLY 142 KB、SOG 89 KB、SPZ 216 KB、glTF 2.1 MB、.splat 279 KB、Video Zero KB、Wiggle Zero KB 以及 Web 378 KB;下方是蓝色的「Export PLY (3DGS Standard)」按钮 和「Upload to SuperSplat…」条目

图中所示内容: 每个格式卡片下方的大小信息是根据当前的 Gaussian 数量和格式开销实时计算的——而不是硬编码的。同一场景由此得出 2.2 MB 的 PLY、142 KB 的 cPLY、89 KB 的 SOG、216 KB 的 SPZ、2.1 MB 的 glTF 以及 279 KB 的 .splat;Web 格式的 378 KB 更大,是因为其中还包含 了查看器本身。Video 和 Wiggle 显示「Zero KB」,因为它们的大小只有在 编码完成后才能确定。选中的卡片带有蓝色边框,下方的按钮会沿用其名称 ——此处为「Export PLY (3DGS Standard)」。标题下方写着一行文字: 「Leveling the floor turns the view at once; the chosen orientation and format apply when saving」。

一次完成的训练会得到一个 Gaussian 云——由几十万到几百万个 3D 高斯分布组成的集合,它们共同重建出场景。本章描述了将这个云写入硬盘 的十种方式。其中六种是纯粹的 3D 数据格式(PLY、Compressed PLY、SPZ、 SOG、glTF、.splat),一种将云与现成的 HTML 查看器打包在一起(Web Viewer),一种从环绕相机运镜中渲染出一个 MP4 文件(Orbit Video), 另外两种不导出任何 Gaussian 内容,而只导出 SfM 结果(相机位姿和粗糙 点云),以便在其他训练流水线中重复使用(transforms.json + COLMAP 工作区)。

这十种方式中有八种在导出区域以卡片形式提供——transforms.json 和 COLMAP 工作区只出现在菜单中。此外,网格中还包含第九张卡片 Wiggle,而在导出按钮下方还有 Upload to SuperSplat…,它不是将场景写入文件,而是直接将场景 发送到网络上的 SuperSplat 编辑器。

哪种格式在何时是正确的选择,取决于目标。若要在不损失质量的前提下 归档完整数据,应选用 PLY。若要用于自有网站上的 Web 查看器,通常 .splat 或内置的 Web Viewer 就足够了。如果文件必须尽可能小,那么 SPZ 或 SOG 值得考虑。若要在 Nerfstudio、Postshot 或 Brush 中重复使用 SfM 结果,transforms.json 和 COLMAP 工作区才是正确的方式。

所有导出功能都位于「Export」菜单中,以及简单模式向导的最后一步。 大多数格式完全符合沙盒规范,可在 App Store 版本中使用。只有 SOG 需要一个外部二进制文件(cwebp),而它在 App Store 构建版本中不一定 存在——详情参见 E4。

E1 — PLY (.ply)

位置

菜单栏 → Export → 3D Formats → Export PLY…(⌘E)。 简单模式:向导步骤「Export」→ 格式卡片「PLY」。 大小: 典型值为 100 %(参考值)。兼容对象: SuperSplat、PolyCam、所有 3DGS 查看器。

技术细节

PLY 是 3D Gaussian Splatting 的规范存储格式。 RadianceKit 写出一个采用标准化 3DGS 属性布局的二进制小端文件:每个 Gaussian 包含三分量的位置、始终置零的三个法线、三个用于基础 RGB 颜色的 DC-SH 系数(f_dc_0..2),随后是最多 45 个额外的 SH 系数 (f_rest_0..44),按照 Kerbl-2023 论文定义的转置通道优先排列方式 (先是所有 R 通道系数,然后是所有 G,再是所有 B),接着是 Logit 不透明度(原始的 pre-Sigmoid 值)、三个对数空间的缩放值以及一个 wxyz 四元数旋转。实际导出的最大 SH 阶数会被限制为用户期望值与实际 已学习阶数中的较小者;默认值为 3(45 个附加系数)。写入前会以 64 位整数计算负载大小,以便捕获超大云数据时可能出现的溢出。文件采用 原子写入方式,这在处理大型云数据时会暂时占用双倍的磁盘空间。

E2 — 压缩 PLY (.ply)

位置

菜单栏 → Export → 3D Formats → Export Compressed PLY…。 简单模式:格式卡片「Compressed PLY」。 大小: 相较于 PLY 约为 10–20 %(5 到 10 倍压缩)。 兼容对象: SuperSplat、PlayCanvas 引擎、基于 Web 的查看器。

技术细节

这是 PlayCanvas 版本的 PLY 格式,采用分块量化。 Gaussians 以 256 个为一组进行分块。每个分块中,位置、缩放和颜色的 最小/最大边界会分别存储在头部;各个 Gaussian 相对于这些边界引用其 数值,并压缩为每项 32 位:位置和缩放采用 11-10-11 位打包,旋转采用 2-10-10-10 位的「Smallest-Three」四元数,颜色采用 8-8-8-8 的 RGBA。 更高阶的 SH 系数每个分量仅用 8 位量化(每个系数和 Gaussian 三个 字节)。格式本身仍然是 ASCII 头部的 PLY,因此原则上可以用 PLY 工具进行校验,但顶点属性被声明为 uint 字段。SH 阶数默认为 0(无附加系数),以最大化压缩率——也可以显式选择更高的 SH 阶数。

E3 — SPZ (.spz)

位置

菜单栏 → Export → 3D Formats → Export SPZ…。 简单模式:格式卡片「SPZ」。 大小: 相较于 PLY 约为 10 %(小 90 %)。 兼容对象: Niantic Scaniverse、Niantic Spatial Fields、 MetalSplatter。

技术细节

Niantic 的 SPZ-v2 格式。位置被打包为 24 位定点数(约合 0.25 毫米分辨率),缩放值在对数空间中进行 8 位 量化,旋转采用 8 位 Smallest-Three(在 v2 中只存储 xyz,w 由解码器 从四元数范数中推导),不透明度采用经过 Sigmoid 处理的 8 位值。 DC-SH 使用 SPZ 特有的打包公式(dc_raw * 0.15 * 255 + 0.5 * 255) 存储,更高的 SH 波段每个系数使用 5 位(波段 1)或 4 位(波段 2-3)。 整个打包后的二进制数据块随后使用标准 gzip(RFC 1952)进行压缩, 生成带有魔数 1f 8b 的 gzip 容器格式。RadianceKit 为此调用系统的 gzip,因为苹果自带的 zlib API 会产生专有的 Apple 帧格式,这与 Spatial Fields 或 MetalSplatter 中的 SPZ 读取器不兼容。系统的 gzip 在 macOS 沙盒内依然可以被启动调用。

E4 — SOG (.sog)

位置

菜单栏 → Export → 3D Formats → Export SOG…。 简单模式:格式卡片「SOG」。 大小: 相较于 PLY 约为 5–6 %(15 到 20 倍压缩——最小的 选项)。兼容对象: PlayCanvas 引擎、SuperSplat 编辑器。

技术细节

「Spatially Ordered Gaussians」——一种 PlayCanvas 格式,将云以 GPU 就绪的形式存储在多张无损 WebP 图像中。 首先,所有 Gaussians 按照 3D Morton 码(30 位 Z-Order,每轴 10 位) 进行空间排序,这为图像带来了渲染器中后续的缓存局部性优势。然后, 位置通过对称对数变换(以获得更好的动态范围)量化为 16 位值,并拆分 到两张 RGBA 图像中(means_l.webp 存放低 8 位,means_u.webp 存放高 8 位)。旋转以 3×8 位加 2 位模式的 Smallest-Three 编码在一张 RGBA 图像中(模式存放在 Alpha 通道,值为 252 + largest)。缩放和 DC-SH 各用一个含 256 个条目的码本进行量化(基于所有数值的百分位 分布),索引存放在 scales.webpsh0.webp 中。这五张图像加上 一个包含码本和边界的 meta.json 会被打包进一个 ZIP 文件(自定义 编码器,因为沙盒阻止了系统的 zip),并以 .sog 扩展名保存。

注意沙盒限制:SOG 是唯一需要外部二进制文件的格式选项。 WebP 编码阶段会调用位于 /usr/local/bin/cwebp/opt/homebrew/bin/cwebpcwebp。如果找不到 cwebp 二进制文件, 代码会回退到原始 PNG 编码——但请注意:PNG 回退在 SuperSplat 中无法使用。在 App Store 版本中,可用性依据构建变体进行判断; 在开发者版本中,必须通过 Homebrew 安装 cwebp (brew install webp)。

E5 — glTF (.glb)

位置

菜单栏 → Export → 3D Formats → Export glTF…。 简单模式:格式卡片「glTF」。 大小: 与 PLY 相当。兼容对象: 支持 KHR_gaussian_splatting 扩展(Khronos 草案标准)的 glTF 查看器。

技术细节

按照 KHR_gaussian_splatting 扩展规范,写出一个 自包含的 .glb 二进制文件(没有单独的 bin 文件附件)。位置以常规 glTF 的 POSITION 顶点数据(float3)存储,其他所有属性(旋转为 float4,缩放为 float3,不透明度为 float,SH 系数为 float3 × shCoeffCount)位于额外的顶点属性中,并通过扩展进行引用。重要的是: glTF 使用右手 Y-up 坐标系,而 COLMAP/3DGS 使用 Y-down/Z-forward。 因此导出器施加了绕 X 轴的 180 度旋转——位置被重写为 (x, -y, -z), 四元数被调整为 (w, x, -y, -z)。这样就能在 glTF 查看器中得到几何 正确、手性一致(非镜像)的呈现。JSON 和二进制块会按照 GLB 标准的 要求填充至 4 字节对齐。

E6 — Splat (.splat)

位置

菜单栏 → Export → 3D Formats → Export .splat…。 简单模式:格式卡片「.splat」。 大小: 每个 Gaussian 精确为 32 字节。兼容对象: gsplat.js、基于 Web 的查看器(antimatter15 参考实现)、大多数浏览器 3DGS 演示。

技术细节

antimatter15 的 .splat 格式——每个 Gaussian 32 字节,没有头部,没有间接寻址。每条记录的布局为:3 个 float32 表示 位置(世界坐标)、3 个 float32 表示缩放(从内部缓冲区的对数空间进行 exp 变换而来)、4 个 uint8 表示 RGBA 颜色(DC-SH 系数以 SH_C0 = 0.282... 进行缩放并限制到 [0,255] 区间)、4 个 uint8 表示四元数(w、x、y、z,经过归一化并以 128 + 128*q 编码到字节 范围内)。只存储 DC-SH——更高阶的 SH 波段会被丢弃。这使得格式极为 紧凑,但代价是失去了在镜面反射或高光处出现的视角相关的颜色变化。 写入顺序完全按照云数据的索引顺序(没有空间排序),像 gsplat.js 这样的 Web 查看器就是基于此进行渲染的。

在 Firefox 中打开的 Web Viewer — Bjoern 的花束 Splat 渲染出周围的相机标记球体,上方可见浏览器标签栏,无需 CDN/服务器设置
在 Firefox 中打开的 Web Viewer — Bjoern 的花束 Splat 渲染出 周围的相机标记球体,上方可见浏览器标签栏,无需 CDN/服务器设置。 独立的 flowers-01.html 直接从访达中双击、在默认浏览器中打开 —内嵌的 WebGL2 程序立即渲染出 Gaussian 云,无需联网或服务器。 花束周围的黑色标记是训练相机,可选择性显示。鼠标拖拽可旋转, 滚动可缩放。

E7 — Web Viewer (.html)

位置

菜单栏 → Export → Media → Export Web Viewer…。 简单模式:格式卡片「Web Viewer」。 大小: Splat 数据经 base64 编码(约 4/3 的开销)+ 约 5 KB 的 HTML/JS 外壳。兼容对象: 任何支持 WebGL2 的现代浏览器 (所有桌面系统、iOS 15+、Android 5+)。

技术细节

将 Gaussian 云与一个完全内联编写的 WebGL2 渲染器 一起打包进单个 .html 文件中。没有 CDN 依赖,没有 WASM,没有第二个 文件。云数据内部首先被编码为 .splat 二进制格式(与 E6 相同的 32 字节逻辑),然后进行 base64 嵌入,再在浏览器中通过 atob 解码。 内置的渲染器自行完成 WebGL2 排序、鼠标环绕控制以及每帧 CPU 排序;整个 JS 代码(着色器、数学运算、循环)都能在输出的 HTML 中 看到。在存储与渲染器边界处的坐标轴约定与 E5 完全相同:位置为 (x, -y, -z),四元数为 (w, x, -y, -z)。可以选择性地显示一个品牌 叠加层(免费版开关)。由于一切都是内联的,该文件也可以直接通过 file:// 协议运行——测试时无需本地 Web 服务器。

从 flowers-01.mp4 中提取的单帧 — Bjoern 的花束以侧面渲染呈现,可见带相机标记的白色平台,黑色背景 — 典型的环绕相机运镜帧,约在视频第 5 秒处
从 flowers-01.mp4 中提取的单帧 — Bjoern 的花束以侧面渲染 呈现,可见带相机标记的白色平台,黑色背景(默认视口背景,可在 设置中更改)。相机沿一条参数化轨迹环绕场景(仰角和距离固定, 偏航角旋转),时长通常为 6–10 秒,帧率为 30 或 60 fps。帧 分辨率可通过所选视频预设从 480p 缩放至 8K。

E8 — Orbit Video (.mp4/.mov)

位置

菜单栏 → Viewport → Record Turntable Video 或 菜单栏 → Export → Media → Export Orbit Video…。简单模式:格式卡片 「Orbit Video」,附带时长滑块 3–30 秒。 大小: 取决于时长、分辨率、比特率。兼容对象: 所有平台(H.264 和 HEVC 是苹果标准)。

技术细节

沿一条参数化的环绕相机路径渲染 Gaussian 云, 并通过 AVAssetWriter 将每一帧编码进 MP4 或 MOV 文件。环绕配置控制 转速(圈数)、距离、仰角、视场角、时长以及缓入/缓出因子。Orbit Video 导出通过 RadianceKit 自身的渲染阶段完成,包含完整的 SH 求值——与应用内的视口画面像素级一致(所见即所得)。每一帧都会用 渲染器计算出的世界适配矩阵(用于将内部坐标旋转到 Y-up 的环绕世界) 乘以相机矩阵,随后应用一个相机转换镜像(环绕 Y-up → COLMAP Y-down)。离屏渲染目标通过 IOSurface 被拉取为供编码器使用的 CVPixelBuffer。编码器支持 H.264 和 HEVC、可配置的比特率以及从 480p 到 8K 的分辨率。在渲染第一帧之前,渲染器会等待 200 毫秒,以确保 初始的 Splat 排序完成。此导出过程是 GPU 密集型的——在 8K 分辨率和 数百万 Gaussians 的情况下,每帧渲染时间可达数秒,因此 6 秒视频的 总渲染时间可能达到 10 到 30 分钟。

E9 — SfM Transforms (transforms.json)

位置

菜单栏 → Export → Photogrammetry → Export SfM (transforms.json)…。 大小: 典型值为 1–10 KB(只有位姿 + 内参,没有图像, 没有 Gaussians)。兼容对象: nerfstudio、Brush、gsplat、 OpenSplat、Meshroom,以及所有现代的前馈式 3DGS 训练器。

技术细节

写出 nerfstudio 的 transforms.json 格式,包含 一份相机位姿列表以及共享的内参。对每个相机,会先对视图矩阵 (RadianceKit 内部:COLMAP 约定下的世界到相机变换)求逆,然后镜像 相机局部的 Y 轴和 Z 轴基向量,以转换为 nerfstudio 约定(OpenGL 风格,相机沿 -Z 方向观察,+Y 朝上)。最终的 4×4 矩阵作为 按行主序嵌套的双精度数组,存放在每帧的 transform_matrix 字段中。 内参存储在顶层(焦距 x/y、主点 x/y、图像宽/高, camera_model = "OPENCV",加上畸变系数 k1, k2, p1, p2)——除非 导出器检测到多组不同的内参集合,此时会按帧分别写入。图像路径以 相对于 JSON 文件的 images/<filename> 形式写出;用户必须创建一个 与之同级的 images/ 文件夹,其中存放训练用的照片。

E10 — COLMAP 工作区 (sparse/0/)

位置

菜单栏 → Export → Photogrammetry → Export SfM (COLMAP Workspace)…。 大小: 三个二进制文件加起来典型为 4–8 MB — points3D.bin 占主导(稀疏点云中每个 3D 点一行),images.bincameras.bin 各自都明显小于 100 KB。兼容对象: COLMAP 本身、Nerfstudio、Postshot、Meshroom,以及所有期望使用 COLMAP sparse/ 目录的工具。

技术细节

写出标准的 COLMAP sparse/0/ 布局,包含三个 二进制文件:cameras.binimages.binpoints3D.bin。格式参考 的是官方 COLMAP 文档。cameras.bin 包含去重后的内参列表(具有 相同内参和图像尺寸的相机会被合并为一个条目);使用的相机模型是 OPENCV(模型 4),包含 fx/fy/cx/cy 以及四个畸变系数 k1/k2/p1/p2。images.bin 为每张图像列出位姿(以 wxyz 四元数加 平移表示),以及相机 ID 和文件名;不存储 2D-3D 对应关系。 points3D.bin 包含 SfM 点云,含位置、颜色(0-255 的 RGB)以及重 投影误差和轨迹长度的默认值。所有内容均以小端方式写入。重新导入 RadianceKit 可通过文件菜单 → 「Import COLMAP/Metashape Workspace…」完成(参见 SfM 后端章节中的 Q3)。

什么时候用哪种格式?

目标格式
自建网页上的网页查看器E7 Web Viewer (.html)
使用 gsplat.js 的网页查看器E6 Splat (.splat)
Postshot / Nerfstudio 中的流程复用E9 transforms.json + E10 COLMAP Workspace
SuperSplat 编辑E1 PLY 或 E2 Compressed PLY
Niantic Scaniverse / Spatial FieldsE3 SPZ
最大压缩率E4 SOG (需要 cwebp)
营销/社交媒体视频E8 Orbit Video
在网络上继续编辑场景格式网格下方的“Upload to SuperSplat…” 按钮

快速对比

格式扩展名沙盒大小(1M 高斯)最佳用途
E1 PLY.ply~250 MB归档,最高 兼容性
E2 Compressed PLY.ply~40 MBWeb + SuperSplat
E3 SPZ.spz是(gzip-Spawn)~40 MBNiantic + 移动端
E4 SOG.sog有条件(cwebp)~20 MB最大 压缩率
E5 glTF.glb~250 MBKhronos 流水线
E6 Splat.splat~32 MBgsplat.js Web 查看器
E7 Web 查看器.html~45 MB独立 浏览器文件
E8 环绕 视频.mp4/.mov可变社交/营销
E9 SfM Transforms.json~5 KB位姿传递
E10 COLMAP Workspace目录~4–8 MB位姿传递(二进制)

大小列为 100 万个 Gaussians、SH 阶数为 3 时的粗略参考值。 实际数值会因场景的可压缩性而有所不同;SH 阶数为 0 时可将 PLY/glTF 的大小缩减为原来的四分之一。