逃离Unity:用Web开发、无人机和3D高斯泼溅把建筑塞进网页
前言
上一篇 Quest 3 + Unity 的文章写的是“怎么把 VR 工程交接下去”。但咱们也得说句实话:Unity 开发这玩意,对接手同学来说还是太重了。
装 Unity、配 Android、配 SDK、配头显、打 APK、真机调试,哪一步没踩过坑都不好意思说自己做过 VR。更麻烦的是,学长一毕业,后面的人要是没 Unity 基础,项目就很容易变成“能跑,但没人敢动”的祖传工程。
所以学长又想到了一个鬼点子:能不能别老逮着 Unity 折腾?能不能直接用 Web 开发,把模型、点云或者 3D 高斯泼溅丢进网页里,浏览器打开就能看,Quest 3 也直接用浏览器进 WebXR?
别人已经有现成例子了。极客湾做过一个办公室 room tour,把办公室用无人机和高斯泼溅扫描出来,再做成可以互动游玩的赛博展馆。视频在这里:
- 【欢迎参观极客湾!我们把办公室做成了游戏地图!】https://b23.tv/BV1Ba7k6AEdF
他们的思路大概就是:把真实办公室扫下来,放到 roomtour.socpk.com,然后让大家像逛游戏地图一样进去看办公室、看藏品、玩互动。我们当然不一定要做得和他们一样花,但方向可以摸着这个过河:现实空间扫描 + Web 互动 + 轻量部署。
这篇文章就按这个思路来讲:
- 为什么 Unity 之外还有 Web 这条路。
- Web 3D、点云、3D 高斯泼溅现在大概是什么状态。
- 用无人机航拍视频/照片,怎么把建筑还原出来。
- 以 RealityCapture/RealityScan 为例,怎么从照片走到可用模型。
- 怎么把模型压缩后丢进 Web。
- 最后给一份最小
index.html:后面的人只要替换一个模型,移动和 WebXR 基础组件都已经写好了。
本文还参考了我之前的 web端海洋文博管 项目,开源代码在 https://github.com/Moeary/Vue_Ocean_Museum 线上参观渠道在 https://oceanmuseum.vercel.app/#/3d 。那个项目里已经有一个 OceanScene.vue,用的是 Vue 3 + Three.js,支持 GLB 加载、PC 鼠标锁定移动、手机触摸旋转和 Quest 3 WebXR 摇杆移动, 后来者可以仿照着做。
一、这个点子到底靠不靠谱
Unity 的优势是完整、成熟、适合做真正的 VR 应用;
Web 的优势是轻、快、好传播。我们想逃离 Unity,不是因为 Unity 不行,而是因为这个项目如果只是“看建筑、逛展馆、做轻交互”,每次都编译 APK 真的太折磨。
1
2
3
4
5
无人机航拍
-> RealityScan / RealityCapture 处理
-> Blender 清理、减面、压缩、导出 GLB
-> Web / Three.js 再压缩处理
-> 浏览器呈现 3D 场景,必要时接 WebXR
这条线的好处是很现实:
这样安排以后,大家分工也更清楚:
- 会飞无人机的人负责把素材拍好。
- 会 RealityScan 的人负责把建筑算出来。
- 会 Blender 的人负责把模型收拾干净。
- 会 Web 的人负责把 GLB 丢进 Three.js,并把移动、缩放、热点、WebXR 做出来。
别一上来就纠结“哪个技术最先进”。先问几个更朴素的问题:
- 能不能在手机上开?
- 能不能在 Quest 3 浏览器里开?
- 模型能不能控制在几十 MB,而不是几百 MB?
- 后面的人能不能看懂这个流程,并且替换自己的建筑?
很多项目最后不是死在算法上,而是死在一个 800MB 的模型、一个加载半分钟的网页,以及一句“我这边打不开”。我们这条路线的核心目标就一个:先让东西能打开、能看、能交接。
二、当前 Web 3D 的现状
经过几年的发展,Web 3D 不是小玩具了。商品展示、数字孪生、WebGIS、在线展馆、轻量 VR 预览,都已经有人在用。它的问题不是“能不能做”,而是“你能不能把资产控制到浏览器吃得下”。
1. Web 3D 的主力仍然是 glTF/GLB
在 Web 里,glTF/GLB 基本就是 3D 资产交付的默认选择。Khronos 官方也把 glTF 定位成高效传输和加载 3D 场景/模型的格式,.glb 则是把 JSON、二进制 buffer、贴图等打进一个文件里的二进制版本。
Three.js 的 GLTFLoader 对 glTF 2.0 支持很完整,并且支持常见扩展,例如:
KHR_draco_mesh_compressionEXT_meshopt_compressionKHR_mesh_quantizationKHR_texture_basisuEXT_texture_webp
翻译成人话就是:你可以先用 RealityCapture/RealityScan 把建筑算出来,再经过 Blender / glTF-Transform / gltfpack 这些工具压一压,最后变成浏览器能比较舒服加载的 .glb。
2. WebXR 不是 Unity 的完全替代品,但很适合偷懒
WebXR 最大的爽点是不用安装 APK。你把网页部署到 HTTPS(因为浏览器限制没有证书就不能访问webxr内容),Quest 3 浏览器打开,就能进入VR沉浸模式。
Three.js 里开启 WebXR 的核心非常简单:
1
2
renderer.xr.enabled = true;
document.body.appendChild(VRButton.createButton(renderer));
但 WebXR 的短板也很明显:
- 浏览器权限和兼容性要看设备(但只做前后移动的话倒不用担心兼容性问题,基本都照着meta quest那样的遥感手柄来设计的)。
- 复杂物理、复杂 UI、手势交互不如 Unity/Unreal 省心。
- 大的glb模型会受移动端 GPU、内存和网络限制。
所以它适合做轻量 VR 看模型在线展馆预览快速给老师同学看效果。
所以实际上开发可以以web开发为主,先把模型展示、移动、WebXR 跑通;等场景都打的差不多了我们再回到之前的unity+meta quest vr开发之中,unity能直接写插件写shader获得更好的表现效果
三、3D 高斯泼溅:为什么适合我们的项目
3D Gaussian Splatting,简称 3DGS。名字很吓人,先不用怕。你可以粗暴理解成:它不是用一堆三角面片去拼物体,而是用很多带位置、方向、尺度、颜色和透明度的“椭球状点”去表示场景。
为什么它适合我们这种“把现实空间扫进网页”的活?因为它很擅长把照片里的真实观感保留下来。极客湾办公室那个例子能让人眼前一亮,也正是因为它不是传统低模展馆,而是直接把真实空间那种杂乱、细节、光照味道都端上来了(也有弊端,用高斯的话基本不太好后处理,比如环境打光啥的,相机拍到啥就是啥样,没法模拟晚上关灯或者灯光全开时的视角)。
2023 年 SIGGRAPH 的经典论文《3D Gaussian Splatting for Real-Time Radiance Field Rendering》把这条路线带火了。它的关键优势是:
- 输入可以来自多张照片或视频抽帧。
- 训练完成后可以实时渲染。
- 对真实场景的细碎纹理、树叶、栏杆、雕塑、反光材质表现很好。
- 比早期很多 NeRF 路线更适合交互式浏览。
但现在做 Web 项目时要注意:3DGS 还不是传统意义上的“普通 3D 模型”,不要以为它能像 FBX/GLB 一样到处乱塞。
它的坑主要有:
- 格式还在快速变化:
.ply、.splat、.spz、.ksplat、.sog都有人用。 - 浏览器加载需要专门 renderer,不是
GLTFLoader直接加载就完事。 - 物理碰撞、遮挡剔除、测量、编辑和材质系统还不如网格成熟。
- 文件可能很大,不压缩很容易几十到几百 MB。
好消息是标准化已经在推进。Khronos 在 2026 年 2 月发布了 KHR_gaussian_splatting 的 glTF 扩展候选,目标是让 Gaussian Splat 能进入 glTF 生态。这个很重要,因为一旦 glTF 生态接住 3DGS,以后工具链会少很多“这玩意只能在某某 viewer 打开”的尴尬。
对于我们的项目,我们目前没必要死磕他的格式,我们把3d高斯转出的模型都丢进blender里面后处理一下导出glb的就能用了
四、用无人机航拍还原建筑内外视角
Epic家的 RealityScan 软件很强,但它不是魔法。照片烂,软件也救不回来。很多人第一次做重建,问题不是不会点按钮,而是素材从一开始就拍崩了。
参考教程可以看 【【全】大型校园无人机倾斜摄影建模指南】 https://b23.tv/BV1W3411s72V
1. 拍摄原则
无人机拍建筑时,尽量做到:
- 相邻照片重叠率 70% 到 85%。
- 不只拍正上方,要拍斜向环绕,建筑立面需要 oblique 角度。
- 一栋楼至少绕 2 到 3 圈:低空立面一圈、中高空一圈、俯视一圈。
- 曝光和白平衡尽量锁定,不要一会儿亮一会儿暗。
- 避开强反光、雨天、雾天、大风和强烈移动阴影。
- 避开大面积玻璃幕墙、纯白墙、纯黑墙、重复窗格,这些区域要多角度补拍。
- 拍摄时尽量不要让路人、车、树叶大幅移动占据主体。
如果只有视频,也可以用视频抽帧:
- 4K 视频优于 1080p。
- 抽帧不要太密,一般 1 到 3 FPS 先试。
- 模糊帧、转场帧、过曝帧要删掉。
- 抽出的图片最好保持原始分辨率。
2. 航线建议
以一栋教学楼或展馆为例,可以这样拍:
| 航线 | 作用 |
|---|---|
| 正射网格 | 获得屋顶和整体平面结构 |
| 45 度斜拍网格 | 获得屋顶边缘、立面上半部分 |
| 环绕立面 | 获得门窗、柱子、墙面纹理 |
| 低空补拍 | 补入口、牌匾、台阶、雕塑 |
如果建筑周围树很多,3DGS 可能看起来比网格舒服,因为树叶这类细碎结构对网格重建很不友好。但如果你要做碰撞和漫游,树可以单独简化,不要强行把每片叶子都网格化。真的,别和树叶较劲。
五、利用软件处理航拍数据
软件首推 RealityScan。它们都支持照片和视频输入,能自动对齐、重建、生成高模,还能输出贴图。RealityScan 是 Epic 免费提供的工具,适合快速上手
但这一部分不细讲,看其他人的教程更合适
b站其他人的教程:【RealityScan2.0 + Blender测量摄影 建模、修复、简化发布全流程】 https://b23.tv/BV12guwzdEkL
官方教程demo:https://dev.epicgames.com/community/realityscan/learning
1. 准备图片/视频
有需要的可以私聊我(如果你有我联系方式的话)获取相关建筑航拍素材作为参考
2. 导入并对齐
3. 设置重建区域
4. 生成高模
5. 简化模型
6. 贴图
7. 导出为 OBJ/FBX/GLB,转入blender做后处理
六、把建筑模型压到 Web 能跑
到这一步,建筑已经“捏”出来了,但还不能直接丢网页。RealityScan 算出来的东西通常很大,属于电脑看着都喘、浏览器看了想辞职的那种。
0. Blender后处理
把模型导入 Blender,检查比例、原点、朝向,清理飞面和无关区域,简化到 100k 到 500k 三角面,重新 unwrap 和贴图,最后导出为 GLB文件。
1. 目标大小
普通网页模型建议先按这个目标控制:
| 平台 | 单模型建议大小 |
|---|---|
| 手机网页 | 10MB 到 40MB |
| PC 网页 | 30MB 到 120MB |
| Quest 3 WebXR | 20MB 到 80MB |
| 校园内网大屏 | 可以更大,但仍建议分块加载 |
如果一个模型压完还有 300MB,不是绝对不能用,但体验会很痛苦。尤其是 Quest 3 浏览器,因为要双目渲染,同时分辨率还高,内存和 GPU 都比台式机紧张。我们做场馆还原web路线,本来就是为了省事,不是为了换一种方式折磨自己。
2. glTF/GLB 压缩方向
Web GLB 常用优化有三类:
| 优化 | 作用 |
|---|---|
| Meshopt | 压几何、重排顶点、提升传输和加载效率 |
| Draco | 强几何压缩,体积小,但解码成本更高 |
| KTX2/BasisU | 纹理 GPU 压缩,降低文件体积和显存压力 |
Three.js 的 GLTFLoader 已经支持 Draco、Meshopt、KTX2 等扩展,但需要在代码里配置对应 decoder。
3. glTF-Transform 示例
安装:
1
npm install --global @gltf-transform/cli
先检查模型:
1
gltf-transform inspect building.glb
常规压缩:
1
gltf-transform optimize building.glb building.web.glb --texture-compress webp --compress meshopt
如果希望贴图走 KTX2:
1
gltf-transform optimize building.glb building.ktx2.glb --texture-compress ktx2 --compress meshopt
如果模型几何特别大,也可以尝试 Draco:
1
gltf-transform draco building.glb building.draco.glb
我个人对 WebXR 更偏向先试 Meshopt + KTX2。Draco 体积可能更小,但首屏解码可能更慢。具体还是以真机测试为准。
4. 简单验收标准
压完以后至少检查:
PC Chrome 能打开,并且测试一轮 Chrome 浏览器自带的 Lighthouse,性能分数尽量达到 60 分以上。

- 手机 Chrome/Edge/Safari 能打开。
- Quest 3 浏览器能打开。
- 进入 VR 后不黑屏。
- 移动时帧率不明显掉。
- 贴图没有丢。
- 模型比例和朝向正确。
不要只在自己电脑的高配置显卡上看,那个不算数。
七、工作流总结
1
2
3
4
5
无人机航拍
-> RealityScan 处理
-> Blender 压缩并导出 GLB
-> Web / Three.js 再压缩处理
-> 浏览器呈现场景
这就是为什么前面要简化流程。我们不是为了炫工具链,而是为了让后面的人能照着做:换一栋楼,换一批照片,重新跑一遍,就能得到一个新的 Web 3D 建筑场景。
最后记住一句话:Web 端不是不能放大场景,而是要按 Web 的方式组织资产。
网格要简化,贴图要压缩,GLB 要继续优化,高斯泼溅和点云可以作为扩展路线。把主线跑通以后,再去加照片级 3DGS 展示、点云档案、WebXR 交互,这样才不会一开始就把项目复杂度拉爆。
Unity 那套工程当然还能继续维护,但如果只是想做一个能传播、能打开、能让人快速看到效果的建筑展馆,无人机航拍 -> RealityScan -> Blender -> GLB -> Three.js 这条路确实值得试。极客湾已经把办公室做成赛博展馆给我们看过一次了,我们没必要闭门造车。先摸着他们过河,跑通,再慢慢加自己的东西。
参考资料
- 极客湾办公室高斯泼溅案例:【欢迎参观极客湾!我们把办公室做成了游戏地图!】https://b23.tv/BV1Ba7k6AEdF
- Khronos glTF: https://www.khronos.org/gltf/
- Khronos glTF Gaussian Splatting Extension: https://www.khronos.org/news/press/gltf-gaussian-splatting-press-release
- 3D Gaussian Splatting 原论文页面: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/
- Three.js GLTFLoader: https://threejs.org/docs/pages/GLTFLoader.html
- Three.js VRButton: https://threejs.org/docs/pages/VRButton.html
- Three.js WebXRManager: https://threejs.org/docs/pages/WebXRManager.html
- Three.js DRACOLoader: https://threejs.org/docs/pages/DRACOLoader.html
- Three.js KTX2Loader: https://threejs.org/docs/pages/KTX2Loader.html
- Epic RealityScan Documentation: https://dev.epicgames.com/documentation/realityscan/realityscan-documentation
- Epic RealityScan Command Line Operations: https://dev.epicgames.com/documentation/realityscan/command-line-operations
- RealityCapture Workflow by Quixel: https://dev.epicgames.com/community/learning/courses/G3v/unreal-engine-capturing-reality-realitycapture-simplified-workflow
- SuperSplat: https://dev.playcanvas.com/products/supersplat
- antimatter15/splat: https://github.com/antimatter15/splat
- COPC Specification: https://copc.io/
- Entwine Point Tile: https://entwine.io/entwine-point-tile.html






