用户指南

第 8 章 — 导出格式

新手模式中的导出格式选择 — 六个格式卡片
新手模式中的导出格式选择 — 六个格式卡片
在 Bjoern 的花束场景 5K 迭代训练后实时显示的导出格式网格 — 全部六个卡片均有动态大小计算 (PLY 742 KB 已选中、SPZ 74 KB、glTF 708 KB、.splat 96 KB、Orbit Video ~Zero KB、Web Viewer 133 KB),右侧的导出历史已含一个已保存的 PLY
在 Bjoern 的花束场景 5K 迭代训练后实时显示的导出格式网格 — 全部六个卡片均有动态大小计算 (PLY 742 KB 已选中、SPZ 74 KB、 glTF 708 KB、.splat 96 KB、Orbit Video ~Zero KB、Web Viewer 133 KB),右侧的导出历史已含一个已保存的 PLY

图中所示 (2 991 Gaussians、SH degree 3,Bjoern 的合成 Blender 花束作为 IP 干净的测试集): 每个格式卡片下方的尺寸数据 是从当前 Gaussian 数量和格式开销实时计算出的 —— 并非硬编码。 由 2 991 个 Gaussians (SH degree 3) 得到:742 KB PLY、74 KB SPZ (通过量化缩小约 10×)、708 KB glTF (带 KHR_gaussian_splatting 扩展,因此与 PLY 几乎等同)、96 KB .splat (压缩的每 Gaussian 24 字节格式)。Orbit Video 显示"~Zero KB",因为大小只有在 MP4 编码完成后才知道。Web Viewer (133 KB) 将独立的 HTML 文件与嵌入 的 WebGL 查看器以及压缩的 Splat 数据打包在一起 —— 由于查看器 开销而大于纯 .splat。右侧的导出历史列出已完成的 PLY 导出 ("training_20260527T211321Z.ply, 743 KB, 23:13"),带格式标签 和"在 Finder 中显示"操作。

完成的训练交付一个 Gaussian-Cloud —— 一组数十万到数百万个 3D 高斯分布的集合,它们共同重建场景。RadianceKit 提供十种将该 点云写入磁盘的方式。其中六种是纯 3D 数据格式 (PLY、Compressed PLY、SPZ、SOG、glTF、.splat),一种将点云与现成的 HTML 查看器 一起打包 (Web Viewer),一种将一段轨道相机运动渲染为 MP4 文件 (Orbit Video),另外两种不导出 Gaussian 内容,而仅导出 SfM 结果 (相机位姿和粗略点云),供其他训练流水线复用 (transforms.json + COLMAP-Workspace)。

何时该选哪种格式取决于目的。要无损归档完整数据,使用 PLY。 要在自己的页面上使用 Web 查看器,通常 .splat 或内置的 Web Viewer 就够。如果文件必须最小,则 SPZ 或 SOG 值得考虑。要在 Nerfstudio、Postshot 或 Brush 中复用 SfM 结果,transforms.json 和 COLMAP-Workspace 是正确的方法。

所有导出功能都位于"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 包含三分量位置、三个始终为零的法线、 三个 DC-SH 系数 (f_dc_0..2) 作为基础 RGB 颜色,然后最多 45 个进一步的 SH 系数 (f_rest_0..44),按 Kerbl-2023 论文定义的 转置 Channel-Major 顺序排列 (先所有 R 通道系数,然后是所有 G,然后是所有 B),后接 Logit-Opacity (原始的 pre-Sigmoid 值)、 三个对数空间尺度,以及一个 wxyz 四元数旋转。最大导出的 SH 阶 会被截断到用户期望值与实际学习到的阶之间的最小值;默认是 3 (45 个剩余系数)。在写入之前,会用 64 位整数计算 Payload 大小, 以捕获极大点云的溢出。文件以原子方式写入,在大点云情况下会 短暂占用双倍磁盘空间。

E2 — Compressed PLY (.ply)

位置

菜单栏 → Export → 3D Formats → Export Compressed PLY…。 新手模式:格式卡片"Compressed PLY"。 大小: 约为 PLY 的 10–20 % (5 到 10 倍压缩)。 兼容性: SuperSplat、PlayCanvas-Engine、基于 Web 的 查看器。

技术细节

PLY 格式的 PlayCanvas 变体,带分块量化。 Gaussians 被分成 256 个一组。每个分块在 Header 中分别存储 位置、Scale 和颜色的 Min/Max 边界;每个 Gaussian 相对于这些 边界引用其值,并被压缩为 32 位:位置和尺度采用 11-10-11-Bit 打包,旋转采用 2-10-10-10-Bit"Smallest-Three"四元数, 颜色采用 8-8-8-8 RGBA。较高的 SH 系数每分量仅用 8 位量化 (每 Gaussian shCoeffCount * 3 个 uchar)。格式本身仍然是 ASCII-Header-PLY,因此原则上可以用 PLY 工具验证,但 Vertex 属性被声明为 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 mm 分辨率),尺度在对数空间中量化为 8 位, 旋转量化为 8 位 Smallest-Three (v2 中仅保存 xyz,w 由解码器 从四元数范数推导出),透明度量化为 sigmoid 化的 8 位值。 DC-SH 使用 SPZ 特有的打包公式 (dc_raw * 0.15 * 255 + 0.5 * 255) 存储,较高的 SH 频段使用 5 位 (Band 1) 或每系数 4 位 (Band 2-3)。 整个打包二进制 Blob 然后用标准 gzip (RFC 1952) 压缩,得到一个 gzipped 容器格式,带有魔术字节 1f 8b。RadianceKit 为此调用 系统 gzip,因为 Apple 内置的 zlib API 会产生专有的 Apple Framing, 与 Spatial Fields 或 MetalSplatter 中的 SPZ 读取器不兼容。 系统 gzip 即使在 macOS 沙盒中也可启动。

E4 — SOG (.sog)

位置

菜单栏 → Export → 3D Formats → Export SOG…。 新手模式:格式卡片"SOG"。 大小: 约为 PLY 的 5–6 % (15 到 20 倍压缩 —— 最小的选项)。兼容性: PlayCanvas-Engine、 SuperSplat-Editor。

技术细节

"Spatially Ordered Gaussians" —— 一种 PlayCanvas 格式,将点云作为多个 Lossless-WebP 图像以 GPU 就绪方式存储。首先所有 Gaussians 按 3D Morton 码 (30 位 Z-Order,每轴 10 位) 进行空间排序,这为后续渲染器中的缓存 局部性带来好处。然后位置使用对称对数变换 (以获得更好的动态 范围) 量化为 16 位值,并分为两张 RGBA 图像 (means_l.webp 存低 8 位,means_u.webp 存高 8 位)。旋转以 3×8 位加 2 位 Mode 的 Smallest-Three 在一张 RGBA 图像中编码 (Mode 落在 Alpha 中,值为 252 + largest)。尺度和 DC-SH 各用一个 256 项 码本量化 (按所有值的百分位分布),索引落在 scales.webpsh0.webp 中。这五张图像加上一个含码本和边界的 meta.json 被打包进一个 ZIP 文件 (自定义编码器,因为沙盒阻止系统 zip), 并以 .sog 后缀保存。

沙盒注意: SOG 是唯一需要外部二进制的格式选项。 WebP 编码阶段从 /usr/local/bin/cwebp/opt/homebrew/bin/cwebp 调用 cwebp。如果找不到 cwebp 二进制,代码会回退到原始 PNG 编码 —— 但:PNG 回退在 SuperSplat 中不能工作。 在 App Store 版本中,根据构建变体评估可用性;在 Developer 版本中,必须通过 Homebrew 安装 cwebp (brew install webp)。

E5 — glTF (.glb)

位置

菜单栏 → Export → 3D Formats → Export glTF…。 新手模式:格式卡片"glTF"。 大小: 与 PLY 相当。兼容性:KHR_gaussian_splatting 扩展的 glTF 查看器 (Khronos 草案 标准)。

技术细节

按照 KHR_gaussian_splatting 扩展规范 写出一个自含的 .glb 二进制文件 (无单独的 bin 文件附件)。 位置存为常规 glTF 的 POSITION 顶点数据 (float3),所有其他 属性 (旋转 float4、尺度 float3、Opacity 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 Scale (从内部缓冲区 的对数空间 exp 变换得到),4 × uint8 RGBA 颜色 (DC-SH 系数 按 SH_C0 = 0.282... 缩放并截断到 [0,255]),4 × uint8 四元数 (w,x,y,z,归一化后以 128 + 128*q 编码到字节范围)。仅保存 DC-SH —— 较高的 SH 频段被丢弃。这使格式极其紧凑,但代价是 丢失反射或镜面高光时的视角相关颜色变化。写入顺序正是点云的 索引顺序 (无空间排序),Web 查看器如 gsplat.js 在此基础上 渲染。

在 Firefox 中打开的 Web Viewer — Bjoern 的花束 Splat 被渲染,周围环绕相机标记球,顶部可见浏览器标签栏,无需 CDN/服务器设置
在 Firefox 中打开的 Web Viewer — Bjoern 的花束 Splat 被渲染, 周围环绕相机标记球,顶部可见浏览器标签栏,无需 CDN/服务器设置。 独立的 flowers-01.html 直接通过 Finder 双击在默认浏览器中 打开 — 嵌入的 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 的花束侧面渲染, 带相机标记的白色平台可见,黑色背景 (默认视口背景,可在设置中 更改)。相机沿参数化轨道围绕场景旋转 (Elevation 与 Distance 固定,Yaw 旋转),典型时长 6–10 秒,30 或 60 fps。 帧分辨率可通过 VideoPreset 从 480p 缩放到 8K。

E8 — Orbit Video (.mp4/.mov)

位置

菜单栏 → Viewport → Record Turntable Video 或 菜单栏 → Export → Media → Export Orbit Video…。新手模式: 格式卡片"Orbit Video",带 3–30 秒时长滑块。 大小: 取决于时长、分辨率、码率。 兼容性: 所有平台 (H.264 和 HEVC 是 Apple 标准)。

技术细节

沿参数化轨道相机运动渲染 Gaussian 点云, 并通过 AVAssetWriter 将每帧编码为 MP4 或 MOV 文件。轨道 配置控制旋转速度 (圈数)、距离、Elevation、FOV、时长以及 Ease-In/Out 因子。每帧将世界调整矩阵 (由渲染器计算,将 内部坐标旋转到 Y-up 轨道世界中) 与相机相乘,然后应用 MetalSplatter 特有的 Y 镜像。离屏渲染目标通过 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 内部:World-to-Camera,COLMAP 约定) 被求逆, 然后镜像相机本地的 Y 与 Z 基向量,以转换到 nerfstudio 约定 (OpenGL 风格,相机沿 -Z 观察,+Y 朝上)。最终的 4×4 矩阵作为按行嵌套的 Double 数组写入每帧的 transform_matrix 字段。内参存储在顶层 (焦距 x/y、主点 x/y、图像宽/高、 camera_model = "OPENCV",加上畸变系数 k1, k2, p1, p2) —— 除非导出器检测到多个不同的内参集,此时它们会按帧写入。 图像路径相对于 JSON 文件写作 images/<filename>;用户必须 建立一个同级 images/ 文件夹并放入训练照片。

E10 — COLMAP Workspace (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 (Model 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)。

何时选择哪种格式?

目标格式
自有页面的 Web 查看器E7 Web Viewer (.html)
使用 gsplat.js 的 Web 查看器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

快速对比

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

大小列是 100 万 Gaussians、SH 阶 3 的大致参考值。 真实值随场景的可压缩性变化;SH 阶 0 会将 PLY/glTF 缩小约 4 倍。