Matterport 太贵太封闭?这个开源项目让你自己搭 3D 虚拟参观系统
SPHR(SPatial Hackable Reality)是一个基于 Three.js 的开源虚拟参观与数字孪生构建工具。它的目标是:用你自己的 360° 图像,在浏览器里构建一套可以完全定制的 3D 空间体验。
Matterport 是目前最常见的虚拟参观方案,但它是商业闭源平台,价格不低,场景的渲染、交互、数据格式都由平台控制。SPHR 选择走另一条路——把整个技术栈暴露出来,让开发者能改掉每一块。

系统由哪几个部分组成
EnvCube(环境立方体)
360° 全景图被映射到一个立方体的六个面上(等矩形格式,建议 8k 分辨率以上)。场景里同时维护两个 EnvCube,用来支持在两张 360° 图之间平滑过渡。
Dollhouse(模型底座)
一个低精度的 3D 网格模型,用于承载鼠标交互(cursor)和俯视模式(Orbit)。作者建议控制在 50k 顶点、纹理 2MB 以内,但可以根据需要调大。
Cursor(光标)
这是实现"立体感"的核心组件。用户看到的是 360° 图像,但光标实际在 Dollhouse 的 3D 网格上移动。两者叠加,就产生了"在真实空间里走动"的感觉。
场景图(SceneGraph / AnnotationGraph)
除了 360° 图,你还可以在场景里放置 3D 模型、嵌入图片或视频作为注释(Annotation)。场景图是完全可定制的,不依赖任何固定格式。
360° 图过渡机制
这是 SPHR 在技术上最值得关注的部分,也是作者开源这个项目的主要原因之一——这个交互在网上几乎没有文档。
从 A 视角移到 B 视角时,摄像机在两个 360° 图的位置之间做插值(lerp),同时用 WebGLCubeRenderTarget 把过渡过程渲染成 Dollhouse 的环境贴图,模拟空间移动的视觉效果。这是对 Three.js MeshBasicMaterial envMap 的一种非常规用法,当前实现还存在内存效率问题,作者在 README 里明确标注了有待优化。
3D 高斯泼溅(Gaussian Splatting)
基于 @mkkellogg 的 Three.js Gaussian Splats 实现,SPHR 在此基础上加入了自定义光标和导览支持。高斯泼溅是一种基于点云的 3D 重建渲染技术,能从大量照片生成可实时浏览的三维场景,视觉效果接近照片真实度。
如何配置和运行
安装与启动
git clone https://github.com/lukehollis/sphr
cd sphr
npm install
npm run start # 本地开发
npm run build # 生产构建支持多语言构建:
LANG=en npm run build
LANG=ar npm run build
LANG=zh npm run build配置空间数据
SPHR 通过两个 JSON 文件定义参观内容:
| 文件 | 作用 |
|---|---|
space.json | 定义所有视角节点(位置、旋转、对应的 360° 图路径) |
tour.json | 定义导览流程(停靠点、文字说明、摄像机方向、播放的音效和模型) |
space.json 的每个节点包含:视角唯一 ID、360° 图路径、摄像机坐标和旋转角度。tour.json 则在节点基础上定义导览顺序、每个停靠点的摄像机朝向(azimuth/polar)、要展示的 3D 模型 ID、要播放的音频 ID 以及叠加显示的文字说明。
仓库 data/ 目录里提供了基于 Nefertari(尼菲尔塔里)数据集的示例文件,可以直接参考格式。
视角模式
每个导览停靠点可以分别指定视角模式:
FPV:第一人称,正常浏览视角ORBIT:俯视模式,从上方看整个 Dollhouse 模型
适合什么场景
SPHR 适合有开发能力、需要完全定制虚拟参观体验的场景:文化遗址数字化、建筑与室内展示、博物馆线上导览、产品展厅等。
它不提供可视化编辑器,也没有云托管服务——你需要自己准备 360° 图像素材、制作低精度 Dollhouse 模型、维护空间和导览的 JSON 配置,以及负责服务器部署。如果你的需求是"快速上线一个虚拟参观",Matterport 或类似的商业服务可能更适合。但如果你需要把参观逻辑嵌入自己的产品、自定义渲染效果或集成三维高斯泼溅数据,SPHR 提供的控制粒度是闭源方案给不了的。
写在最后
SPHR 解决的核心问题是:360° 全景参观中的关键技术(图像过渡、3D 网格交互、场景图管理)在 Three.js 生态里长期缺乏公开的实现参考。作者选择把这些实现细节连同问题和局限一起开放出来,本身就是这个项目的主要价值之一。
目前项目仍在迭代,部分模块(如 IIIF 图片服务依赖、过渡机制的内存优化)按 README 说明有待改进。实际使用前建议先跑通示例数据,再替换成自己的素材。
GitHub 项目地址:https://github.com/lukehollis/sphr (opens in a new tab)