znlgis 博客

GIS开发与技术分享 — GDAL · GeoServer · PostGIS · QGIS · OpenLayers · Cesium · FreeCAD · NPOI

第01章:SuperSplat 项目全景与学习路线

1. SuperSplat 是什么

SuperSplat(仓库名 playcanvas/supersplat,正式名称 SuperSplat Editor)是由 PlayCanvas 团队开发并维护的一款免费、开源、运行于浏览器的 3D 高斯泼溅(3D Gaussian Splatting,简称 3DGS)编辑器。它用于对高斯泼溅模型进行检查(inspect)、编辑(edit)、优化(optimize)和发布(publish)

与传统三维软件不同,SuperSplat 完全基于 Web 技术构建,无需下载安装,打开浏览器即可使用。官方在线版本地址为:

它采用 MIT 许可证,源码完全公开,任何人都可以阅读、修改、二次开发并部署自己的版本。这使它既是一款实用工具,也是学习 3DGS 工程实现与 WebGL/WebGPU 渲染的优秀范本。

一句话定位:SuperSplat 是“3D 高斯泼溅领域的 Photoshop + 发布平台”,但它是开源的、跑在浏览器里的,并且代码结构清晰、值得逐行研究。

2. 为什么要学习 SuperSplat

3D 高斯泼溅是 2023 年由 Inria 提出的辐射场(Radiance Field)新型表达方法(论文《3D Gaussian Splatting for Real-Time Radiance Field Rendering》),相比 NeRF,它具备实时渲染、训练快、画质高的优势,迅速成为三维重建、数字孪生、文物数字化、虚拟现实、电商展示等领域的热点技术。

然而 3DGS 训练(如 COLMAP + gaussian-splatting / Postshot / Nerfstudio)产出的原始 .ply 文件往往存在以下问题:

  • 包含大量背景噪点、漂浮物(floaters);
  • 文件体积巨大(动辄数百 MB 到数 GB),不利于 Web 传输;
  • 坐标系、朝向、比例不规范,难以直接集成到应用中;
  • 缺乏裁剪、清理、动画、发布等后期处理能力。

SuperSplat 正是为了解决“训练之后、上线之前”这一关键环节而生。学习它可以让你:

  1. 掌握 3DGS 后期处理全流程:从加载、清理、裁剪、变换到优化压缩与发布;
  2. 理解高斯泼溅的数据结构:PLY 属性、球谐系数、压缩格式等;
  3. 学习现代 Web 3D 工程:基于 PlayCanvas 引擎、TypeScript、事件驱动架构、Rollup 构建的真实项目;
  4. 具备二次开发能力:为团队定制专属的高斯泼溅工具链或在线产品。

3. 核心功能总览

根据官方文档与源码,SuperSplat 当前主要功能可归纳为以下几类:

功能类别 说明
模型加载 支持拖拽或打开 .ply、压缩 .ply.splat.sog/.json 等高斯泼溅格式,以及 PLY 序列动画
视图浏览 轨道相机、飞行模式、视图立方体(View Cube)、对焦、相机姿态保存
选择工具 矩形、套索、多边形、画笔、球体、洪水填充(Flood)、滴管(Eyedropper)等多种选区方式
数据编辑 隐藏/显示、删除、反选、按属性筛选(位置、不透明度、球谐、缩放)、直方图筛选
变换操作 平移、旋转、缩放高斯点或整个模型,支持 Gizmo 与数值面板
颜色调整 亮度、对比度、饱和度、色调、黑白点、球谐光照编辑
场景管理 多模型管理、合并、模型列表、包围盒尺寸显示
相机动画 关键帧时间轴、相机姿态动画、平滑插值、动画导出
导出发布 导出多种格式、压缩优化、导出图片/视频、一键发布到 PlayCanvas 平台获得在线可分享链接
国际化 基于 i18next 的多语言支持(含简体中文)
渐进式应用 提供 PWA 与 Service Worker,可离线使用

4. 技术栈与依赖

package.json 可以看到 SuperSplat 的关键技术选型:

  • 语言:TypeScript(typescript),全量类型化;
  • 渲染引擎PlayCanvasplaycanvas),负责 WebGL/WebGPU 渲染、高斯泼溅排序与绘制;
  • UI 组件库@playcanvas/pcui(PlayCanvas 的 UI 框架),构建面板、按钮、滑块等;
  • 数据处理@playcanvas/splat-transform,提供高斯泼溅格式读写、转换、压缩(WebP/SOG 等)能力;
  • 构建工具Rolluprollup)+ 多个插件(typescript、node-resolve、scss、terser、json、image 等);
  • 样式:SCSS(sassrollup-plugin-scss);
  • 国际化i18next 系列(i18nexti18next-browser-languagedetectori18next-http-backend);
  • 媒体编码mediabunny(用于视频导出);
  • 代码规范:ESLint(@playcanvas/eslint-config@typescript-eslint);
  • 运行环境:Node.js ≥ 20.19.0(开发构建),浏览器需支持 WebGL2/WebGPU。

package.json 中的关键脚本:

{
  "scripts": {
    "build": "rollup -c",
    "watch": "rollup -c -w",
    "serve": "serve dist -C",
    "develop": "cross-env BUILD_TYPE=debug concurrently --kill-others \"npm run watch\" \"npm run serve\"",
    "lint": "eslint src"
  }
}

5. 源码目录结构鸟瞰

仓库的核心代码位于 src/ 目录下,按职责组织(部分关键文件):

src/
├── main.ts                  # 应用入口:创建引擎、注册各模块事件、初始化 UI
├── editor.ts                # 编辑器核心事件注册(选择、隐藏、删除、重置等)
├── events.ts                # 事件总线(继承 PlayCanvas EventHandler,扩展 function/invoke)
├── scene.ts                 # 场景:管理所有 Element(高斯模型、相机、网格等)
├── scene-config.ts          # 场景配置(背景、相机、网格、色调等默认值)
├── element.ts               # 场景元素基类与类型枚举
├── splat.ts                 # 高斯模型元素(封装 PlayCanvas GSplat)
├── splat-state.ts           # 每个高斯点的状态位(selected / hidden / deleted)
├── splat-serialize.ts       # 序列化/导出:PLY、压缩 PLY、splat、CSV、SOG 等
├── sh-utils.ts              # 球谐(Spherical Harmonics)系数工具
├── edit-ops.ts              # 可撤销编辑操作(选择/隐藏/删除/变换/添加)
├── edit-history.ts          # 撤销/重做历史栈
├── camera.ts                # 相机控制(轨道、飞行、对焦、过渡动画)
├── camera-poses.ts          # 相机姿态(关键帧)管理
├── timeline.ts              # 时间轴与动画播放
├── publish.ts               # 发布到 PlayCanvas 平台
├── file-handler.ts          # 文件打开/保存/导入导出对话框
├── render.ts                # 离屏渲染、图片/视频导出
├── tools/                   # 各类交互工具(见下)
│   ├── tool-manager.ts      #   工具管理器(激活/切换工具)
│   ├── box-selection.ts     #   3D 包围盒选择
│   ├── rect-selection.ts    #   矩形框选
│   ├── lasso-selection.ts   #   套索选择
│   ├── polygon-selection.ts #   多边形选择
│   ├── brush-selection.ts   #   画笔选择
│   ├── sphere-selection.ts  #   球体选择
│   ├── flood-selection.ts   #   洪水填充选择
│   ├── eyedropper-selection.ts # 滴管选择
│   ├── move/rotate/scale-tool.ts # 变换工具
│   └── measure-tool.ts      #   测量工具
└── ui/                      # 界面层(PCUI 构建)
    ├── editor.ts            #   主界面骨架
    ├── menu.ts              #   顶部菜单
    ├── bottom-toolbar.ts    #   底部工具栏
    ├── right-toolbar.ts     #   右侧工具栏
    ├── scene-panel.ts       #   场景面板
    ├── data-panel.ts        #   数据/直方图面板
    ├── view-panel.ts        #   视图设置面板
    ├── color-panel.ts       #   颜色调整面板
    ├── timeline-panel.ts    #   时间轴面板
    ├── export-popup.ts      #   导出弹窗
    ├── publish-settings-dialog.ts # 发布设置
    └── localization.ts      #   国际化初始化

此外还有:

  • static/:静态资源,包含 static/locales/*.json 多语言文件;
  • src/shaders/:自定义着色器;
  • src/io/src/data-processor/:底层 IO 与数据处理;
  • rollup.config.mjs:构建配置。

我们将在第 09、10 章对这些模块做深入剖析。

6. 与生态中其他工具的关系

学习 SuperSplat 时,理解它在整个高斯泼溅工具链中的位置非常重要:

  • 上游(生产 3DGS):COLMAP、Inria gaussian-splatting、Postshot、Nerfstudio、Luma、Polycam 等负责从照片/视频重建出 .ply 高斯模型;
  • SuperSplat(后期处理):清理、裁剪、变换、优化、压缩、动画、发布;
  • 下游(消费 3DGS)
    • PlayCanvas Engine / Editor(在 Web 应用、游戏中渲染);
    • SuperSplat Viewer(轻量查看器);
    • 三维引擎/查看器:Three.js(@mkkellogg/gaussian-splats-3d)、Babylon.js、Unity/Unreal 插件等;
    • 直接通过 <model-viewer> 或 iframe 嵌入网页。

SuperSplat 与 @playcanvas/splat-transform(命令行/库)互补:前者是可视化交互工具,后者是可脚本化的批处理工具,两者共享底层数据处理逻辑。

7. 学习路线建议

本教程按照“先用后改”的顺序组织,建议学习路径如下:

  1. 打基础(第 02 章):理解 3D 高斯泼溅的数学原理与 PLY 数据格式,知道每个属性代表什么;
  2. 会使用(第 03–08 章)
    • 第 03 章:加载模型、视图操作、相机控制;
    • 第 04 章:用各种选择工具选中高斯点并编辑(隐藏、删除、筛选);
    • 第 05 章:变换、裁剪与多模型场景管理;
    • 第 06 章:颜色与球谐外观调整;
    • 第 07 章:相机动画与时间轴;
    • 第 08 章:导出格式、压缩与发布上线。
  3. 懂原理、能改造(第 09–10 章)
    • 第 09 章:搭建本地开发环境,理解事件系统、场景、构建流程;
    • 第 10 章:动手二次开发——新增工具、自定义编辑操作、对接 iframe API、增加语言、集成到自有产品。

不同读者的侧重

  • 三维重建/内容创作者:重点掌握第 03–08 章的使用技巧;
  • Web 前端/3D 开发者:在掌握使用的基础上,深入第 09–10 章的源码与二次开发;
  • 产品/团队负责人:关注第 01、08、10 章,理解它能解决什么问题、如何私有化部署与定制。

8. 推荐资料

9. 本章小结

本章我们建立了对 SuperSplat 的整体认识:它是 PlayCanvas 出品、运行在浏览器中的开源 3D 高斯泼溅编辑器,定位于 3DGS 的“后期处理与发布”环节;技术上基于 TypeScript + PlayCanvas 引擎 + PCUI + Rollup,采用事件驱动架构;功能覆盖加载、选择、编辑、变换、调色、动画、导出与发布。我们还梳理了它在工具链中的位置、源码目录结构与一条循序渐进的学习路线。

下一章我们将深入 3D 高斯泼溅的数学原理与 PLY 数据格式,为后续所有操作打下坚实的理论基础。


目录 下一章 →