Why the museum runs in the browser instead of a game launcher. · Rendered from docs/decisions/0002-web-native-3d-world.md in the project repository · view as Markdown

ADR-0002:Web 原生 3D 世界壳 + Canvas 2D 作品运行时

背景

Inception Space 必须直接在网页运行,包含可行走的科幻博物馆、传送门、多面体 房间、简单桌椅/画板等 3D 物品,同时复用儿童友好的 Live Painting 编辑与动画。 世界还需要嵌入常规 DOM 编辑器、授权流程、AI 计划审批和截图反馈。

决定

Pilot 使用以下组合:

理由

相比 Godot

Godot 很适合独立游戏和桌面式场景编辑,但 Web 导出需要 WebAssembly/WebGL 2, Godot 4 的 C# 项目仍不能导出 Web;多线程 Web 导出还需要 cross-origin isolation。 更重要的是,本项目的儿童编辑器、Canvas Live Painting、授权和 AI 审批都是 Web 原生界面,把它们与 Godot Web 构建双向桥接会形成两个运行时。

相比 Unity

Unity 的 3D 工具和资产生态最强,当前 Unity 6 也支持部分移动浏览器;但 Web 构建 通过 WebAssembly/WebGL 运行,与 DOM/Canvas 编辑器通信需要额外 JavaScript 插件 边界。对于低多边形静态博物馆,这个体量和双语言工作流没有带来对应收益。

相比 p5.js

p5.WebGL 适合教学和单件作品,但缺少本产品需要的完整场景/资产工程层。使用它构建 世界会迫使团队重新实现 glTF 管线、场景生命周期、裁剪、拾取和碰撞约定。

为什么选择 Three.js 而不是立即使用更完整的 Web 引擎

世界几何和互动刻意保持简单,现有代码已经是无框架 TypeScript/Vite。Three.js 能够直接接收 HTML Canvas 作为纹理,并允许对纹理更新、draw call、材质和资源释放 做细粒度控制。若技术切片显示相机、碰撞、序列化或工具链成本过高,Babylon.js 是 第一备选,而不是转向桌面引擎。

风险

性能与退出条件

技术切片包含一条走廊、一个房间、20 个静态物品和四件同时可见的 512px Live Painting,并在 Chromebook、iPad Safari 和桌面浏览器验证。

保留 Three.js 的条件:

若主要失败来自场景工具、碰撞或资源生命周期,而不是 CanvasTexture 本身,则做同场景 Babylon.js 对照切片。只有 Web 原生方案共同失败时,才重新评估 Godot 或 Unity。

非决定