--- title: "结合 3D 游戏引擎的室内世界模型验证方案" date: 2026-05-31 draft: false tags: ["规划", "3D游戏引擎", "仿真", "数字孪生", "物理", "机器人"] categories: ["GameEngine"] --- # 结合 3D 游戏引擎的室内世界模型验证方案 ## 1. 方案定位 本方案在现有 **RoomPlan / ZED 2i / PRISM / 世界模型** 技术链路之外,引入 3D 游戏引擎作为一个新的工程层: > **3D 游戏引擎不是替代 SLAM、PRISM 或 Isaac Sim,而是作为“可交互数字孪生运行时”:负责实时渲染、交互编辑、轻量物理验证、合成数据生成、多人演示与人工标注。** 它解决现有方案中的三个缺口: 1. **可视化缺口**:研究系统输出的 mesh、3DGS、场景图、语义层需要一个直观、可交互、可调试的前台。 2. **交互缺口**:机器人任务不仅要离线评测,还要让研究员快速拖拽物体、修改材质、设置碰撞体、回放动作。 3. **数据缺口**:真实酒店采集成本高,游戏引擎可生成可控扰动、光照变化、遮挡、人流和任务变体。 --- ## 2. 总体架构 ```mermaid flowchart TB subgraph CAPTURE["真实世界采集"] IPHONE["iPhone RoomPlan
USDZ / JSON / CAD"] ZED["ZED 2i
RGB-D / VIO / 点云"] end subgraph MEMORY["空间记忆与世界模型"] PRISM["PRISM
L1-L4 空间记忆"] WM["World Model
M-JEPA / DreamerV3 / Video WM"] end subgraph ASSET["资产转换层"] CLEAN["Mesh 清洗
尺度/坐标/法线/拓扑"] SEM["语义绑定
object_id / affordance / material"] USD["USD / glTF / FBX
统一资产包"] end subgraph ENGINE["3D 游戏引擎运行时"] VIEW["实时可视化
PBR / 灯光 / UI"] PHYS["轻量物理沙盒
碰撞 / 约束 / 关节"] SYN["合成数据
RGB / Depth / Seg / Flow"] EDIT["交互编辑
拖拽 / 标注 / Remix"] end subgraph ROBOT["机器人与评测"] ROS["ROS 2 Bridge"] TASK["任务脚本
导航 / 抓取 / 推拉"] EVAL["评测指标
成功率 / 偏差 / 鲁棒性"] end IPHONE --> CLEAN ZED --> CLEAN CLEAN --> SEM --> USD --> ENGINE PRISM --> SEM ENGINE --> ROS --> TASK --> EVAL ENGINE --> SYN --> WM WM --> PRISM PRISM --> ENGINE ``` --- ## 3. 引擎选型建议 | 引擎 | 适合角色 | 优点 | 局限 | 建议定位 | |------|----------|------|------|----------| | **Unreal Engine** | 高保真酒店数字孪生、演示、复杂交互 | 渲染质量强,Chaos Physics 支持刚体、约束、破坏、流体等实时物理能力 | 机器人生态需要自建桥接,工程复杂度高 | **主推荐:视觉与交互前台** | | **Unity** | 快速原型、Web/移动端、CrowdRoom 编辑器 | C# 开发快,生态适合工具型产品,Unity Robotics 有 ROS TCP Connector | 官方 ROS TCP Connector 最近主版本较旧,长期维护风险需评估 | **推荐:MVP 和产品化编辑器** | | **Godot** | 开源轻量工具、内部标注器 | 开源、轻量、部署灵活 | 高保真渲染、机器人仿真生态弱 | **可选:低成本标注/浏览工具** | | **NVIDIA Isaac Sim** | 机器人精确仿真、传感器、合成数据 | 基于 OpenUSD,面向机器人仿真、测试与合成数据,天然适合 URDF/CAD/USD 资产链路 | 不适合作为普通用户产品前台,学习和硬件成本较高 | **保留:严肃机器人仿真后端** | 推荐采用“双引擎分工”: - **Unreal / Unity**:面向人类研究员和产品用户的交互前台。 - **Isaac Sim**:面向机器人控制、传感器仿真、强化学习和 sim-to-real 的高可信仿真后端。 --- ## 4. 核心管线 ### 4.1 真实扫描到游戏场景 ```text iPhone RoomPlan / ZED 2i → 坐标系统一:米制、Z-up/Y-up 转换、世界原点锚定 → Mesh 清洗:去噪、补洞、简化、法线修复 → 语义绑定:room_id、object_id、category、bbox、affordance → 碰撞体生成:墙体 box collider、家具 convex hull、可操作物体 articulated body → 材质重建:PBR baseColor / roughness / metallic / normal → 导出:USD 为主,glTF/FBX 为 Web 和通用引擎备选 ``` 关键原则: - **视觉资产和物理资产分离**:高精 mesh 用于渲染,低复杂度 collider 用于物理。 - **PRISM ID 贯穿全链路**:游戏引擎中的每个物体都保留 `spatial_node_id`,方便回写空间记忆。 - **可编辑但可追溯**:人工在引擎中修正的材质、碰撞体、关节参数,要以 patch 形式回写,而不是覆盖原始扫描。 ### 4.2 游戏引擎到 PRISM 游戏引擎不是只读 viewer,而是 PRISM 的交互标注和实验入口: | 引擎事件 | 回写到 PRISM | |----------|--------------| | 研究员拖动椅子 | `delta/object_pose_changed` | | 修正门的旋转轴 | L4 节点 `joint.axis` / `joint.limit` | | 标注“可抓取”区域 | `affordance.graspable_regions` | | 设置碰撞体 | L2/L4 物理代理属性 | | 回放机器人失败轨迹 | episode memory + anomaly | ### 4.3 游戏引擎到世界模型 游戏引擎可生成有控制变量的训练数据: | 数据类型 | 用途 | |----------|------| | RGB / Depth / Normal | 训练感知 encoder | | Instance Segmentation | 训练 2D/3D 语义分割 | | Optical Flow | 训练动态预测 | | Action-State Pair | 训练 DreamerV3 / TD-MPC2 | | Counterfactual Rollout | 训练“如果推椅子会怎样”类预测 | --- ## 5. 可交互数字孪生运行时详细方案 本节把“可交互数字孪生运行时”具体化为一个可开发的软件系统。它不是简单的 3D Viewer,而是一个面向研究员、机器人算法工程师和数据标注人员的 **Scene Lab**:能看、能查、能改、能模拟、能回放、能把修改写回 PRISM。 ### 5.1 产品形态 建议先做桌面端,再做 Web 端: | 形态 | 技术路线 | 目标用户 | 适合阶段 | |------|----------|----------|----------| | **桌面 Scene Lab** | Unity Editor Runtime / Unreal Editor Utility | 研究员、算法工程师 | P0 MVP | | **Web Viewer** | Three.js/R3F 或 Unity WebGL | PM、合作酒店、标注人员 | P1 展示与轻编辑 | | **Pixel Streaming 高保真版** | Unreal Pixel Streaming | 远程演示、客户评审 | P1/P2 | P0 阶段推荐做 **Unity 桌面 Scene Lab**,原因是迭代快、UI 工具多、和 JSON/glTF/ROS 接口打通成本低。Unreal 分支用于高保真展示,不阻塞 MVP。 ### 5.2 主界面布局 ```text ┌──────────────────────────────────────────────────────────────┐ │ Top Bar: 场景选择 | 模式切换 | 保存 Patch | 运行任务 | 导出数据 │ ├───────────────┬──────────────────────────────┬───────────────┤ │ Scene Tree │ │ Inspector │ │ - room_305 │ 3D Viewport │ object_id │ │ - wall_01 │ 轨道相机 / 第一人称 / 机器人视角 │ pose/bbox │ │ - bed_01 │ 语义高亮 / 热力图 / 轨迹回放 │ material │ │ - chair_01 │ │ physics │ ├───────────────┴──────────────────────────────┴───────────────┤ │ Timeline / Logs: episode 回放 | 事件列表 | PRISM delta diff │ └──────────────────────────────────────────────────────────────┘ ``` 核心交互模式: | 模式 | 快捷操作 | 用途 | |------|----------|------| | `Explore` | orbit / fly / first-person | 浏览房间、走廊、大堂 | | `Inspect` | click object | 查看 PRISM 节点、语义、bbox、来源帧 | | `Edit` | translate / rotate / scale | 修正物体位姿、墙体边界、家具尺寸 | | `Physics` | add collider / set joint / simulate | 设置碰撞体、质量、摩擦、门/抽屉关节 | | `Annotate` | paint / box / polygon | 标注可抓取区域、不可通行区、危险区 | | `Replay` | play / pause / scrub | 回放机器人轨迹和失败 episode | | `Generate` | randomize / capture | 生成合成 RGB-D、分割、扰动样本 | ### 5.3 模块拆分 ```mermaid flowchart LR LOAD["Scene Loader
USD/glTF/JSON"] REG["Registry
object_id ↔ actor"] VIEW["Viewport
render layers"] SEL["Selection
raycast/pick"] EDIT["Edit Tools
transform/material/collider"] PHYS["Physics Sandbox
simulate/reset"] PATCH["Patch Recorder
diff/event log"] BRIDGE["PRISM Bridge
load/save/query"] EXPORT["Export
dataset/episode"] LOAD --> REG --> VIEW VIEW --> SEL --> EDIT --> PATCH EDIT --> PHYS --> PATCH PATCH --> BRIDGE VIEW --> EXPORT PHYS --> EXPORT ``` | 模块 | 职责 | P0 要做到 | |------|------|-----------| | Scene Loader | 加载 `scene.glb/usd`、`scene_graph.json`、材质贴图 | 一个客房可稳定加载 | | Object Registry | 建立 `spatial_node_id` 到引擎 actor 的映射 | 点击物体能查 PRISM ID | | Viewport | 多视角浏览、图层开关、语义上色 | 支持 RGB / semantic / collider 三种视图 | | Inspector | 展示和编辑节点属性 | 可改类别、名称、位姿、物理参数 | | Edit Tools | 拖拽、旋转、缩放、吸附、撤销 | 支持家具位姿修正 | | Physics Sandbox | 局部物理仿真与 reset | 支持椅子推动、门旋转、抽屉滑动 | | Patch Recorder | 记录所有人工修改 | 导出 JSON Patch | | PRISM Bridge | 读取/写回 PRISM 数据 | 文件级 API 即可,不要求实时服务 | | Dataset Exporter | 截图、深度、分割、episode log | 导出一组训练样本 | ### 5.4 数据输入与目录结构 每个场景打包为一个可版本化目录: ```text hotel_305_scene/ manifest.json assets/ room_shell.glb furniture.glb textures/ prism/ scene_graph.json spatial_nodes.json spatial_edges.json physics/ colliders.json joints.json materials.json episodes/ nav_fail_001.json patches/ 2026-05-31_manual_fix.json ``` `manifest.json` 作为运行时入口: ```json { "scene_id": "hotel_305", "unit": "meter", "up_axis": "Y", "origin": "room_center", "render_assets": ["assets/room_shell.glb", "assets/furniture.glb"], "prism_graph": "prism/scene_graph.json", "physics": { "colliders": "physics/colliders.json", "joints": "physics/joints.json", "materials": "physics/materials.json" } } ``` ### 5.5 实时可视化能力 运行时至少提供 6 个可切换视图: | 视图 | 显示内容 | 用途 | |------|----------|------| | `Render View` | PBR 材质、灯光、阴影 | 检查视觉真实感 | | `Semantic View` | 不同类别用不同颜色 | 检查语义分割和类别错误 | | `Instance View` | 每个实例独立颜色 | 检查实例切分 | | `Physics View` | collider、joint、mass center | 检查物理代理 | | `Navigation View` | 可通行区域、障碍物、路径 | 调试机器人导航 | | `Memory View` | PRISM L1-L4 图层 | 看空间记忆如何覆盖场景 | 关键 UI 功能: - 点击任意物体,高亮对应 `SpatialNode`,并显示来源:RoomPlan / ZED / 人工修正 / WM 推断。 - 支持按类别过滤:只看门、床、桌椅、可移动物、可抓取物、动态障碍。 - 支持显示不确定性:低置信度物体用闪烁边框或热力图提示。 - 支持对比模式:`真实扫描` vs `人工修正后` vs `世界模型预测后`。 ### 5.6 交互编辑能力 编辑不是自由建模,而是围绕 PRISM/机器人验证需要设计的受控编辑。 | 编辑对象 | 可编辑字段 | 保存位置 | |----------|------------|----------| | 房间结构 | 墙体位置、高度、门洞、窗洞 | `patches/*.json` + PRISM L2 | | 家具 | 位姿、尺寸、类别、是否可移动 | PRISM L4 `SpatialNode` | | 材质 | roughness、metallic、friction 映射 | `physics/materials.json` | | 碰撞体 | box/capsule/convex mesh | `physics/colliders.json` | | 关节 | revolute/prismatic、轴向、范围 | `physics/joints.json` | | 导航区域 | walkable、blocked、slow zone | PRISM L2/L3 | | 可供性 | graspable、pushable、openable | PRISM L4 | 编辑操作必须满足三条规则: 1. **所有修改都是 patch**:保留原始扫描结果,不直接覆盖。 2. **每个 patch 有来源**:记录 `author`、`timestamp`、`tool`、`reason`。 3. **可回放和可撤销**:patch 可以按顺序 apply,也可以 rollback。 示例 patch: ```json { "patch_id": "manual_fix_20260531_001", "scene_id": "hotel_305", "author": "researcher", "ops": [ { "op": "replace", "path": "/nodes/chair_305_01/pose_world", "value": [1.42, 0.0, -0.33, 0.0, 0.707, 0.0, 0.707], "reason": "RoomPlan 椅子朝向错误" }, { "op": "add", "path": "/nodes/drawer_305_02/joint", "value": { "type": "prismatic", "axis": [1, 0, 0], "limit_m": [0.0, 0.42] }, "reason": "为床头柜抽屉补充可操作关节" } ] } ``` ### 5.7 轻量物理沙盒 游戏引擎中的物理层只负责快速验证和交互调试,不作为最终物理真值。 P0 支持: - 刚体:椅子、行李箱、垃圾桶、床头柜小物体。 - 静态碰撞体:墙、地面、床、柜体、卫生间台面。 - 关节:门的旋转关节、抽屉的滑动关节。 - 材质参数:摩擦、弹性、质量、重心。 - 局部 reset:只重置当前物体或当前房间,不重载全场景。 P1 再支持: - 布料近似:床单、窗帘只做视觉和碰撞近似。 - 液体/破碎效果:只做异常事件可视化,不进入机器人控制闭环。 - 多人/多机器人:用于拥堵和动态障碍测试。 ### 5.8 与 PRISM 的读写接口 P0 不需要数据库服务,直接文件接口即可: ```text load_scene(manifest.json) → load_assets() → load_prism_graph() → bind_actor_to_spatial_node() edit_object() → update_runtime_actor() → append_patch_op() save_patch() → validate_patch() → write patches/*.json → optional: export prism_delta.json ``` P1 可以升级为本地 HTTP 服务: | API | 方法 | 用途 | |-----|------|------| | `/scene/:id` | GET | 获取场景 manifest | | `/scene/:id/nodes` | GET | 获取 PRISM 节点 | | `/scene/:id/patches` | POST | 保存人工修正 | | `/scene/:id/query` | POST | 自然语言或类别查询 | | `/scene/:id/episodes` | POST | 上传任务回放 | ### 5.9 MVP 功能清单 P0 版本只追求一个客房跑通: | 优先级 | 功能 | 验收标准 | |--------|------|----------| | P0 | 加载一个 RoomPlan/ZED 转换后的客房 | 10 秒内打开,尺度正确 | | P0 | Scene Tree + 物体点击选择 | 点击椅子能显示 `chair_305_01` | | P0 | 语义/实例/物理三种视图 | 一键切换,颜色稳定 | | P0 | 家具位姿修正 | 拖动椅子后能保存 patch | | P0 | Collider 可视化与编辑 | 可给椅子生成 box/convex collider | | P0 | 门/抽屉关节编辑 | 可设置轴向和运动范围 | | P0 | 简单物理运行/暂停/reset | 推椅子不穿墙,reset 后回初始状态 | | P0 | episode 回放 | 加载一条机器人轨迹并显示路径 | | P0 | patch 导出 | 输出可被 PRISM 消化的 JSON | P1 再做增强: - 多房间/走廊拼接; - Web 只读展示; - 合成 RGB-D/Segmentation 数据批量导出; - 自然语言查询:“显示所有可移动椅子”; - 和 ROS 2/Nav2 做在线联调。 --- ## 6. 典型应用场景 ### 场景 A:酒店机器人导航调试 1. PRISM 导出酒店走廊拓扑和局部几何。 2. 游戏引擎加载场景,放置机器人 avatar 和动态行人。 3. 通过 ROS 2 bridge 接入 Nav2 或自研控制器。 4. 在引擎里批量生成拥堵、清洁车占道、门半开等扰动。 5. 输出成功率、碰撞次数、路径偏差和重规划次数。 ### 场景 B:客房物体操作验证 1. RoomPlan/ZED 重建客房,PRISM 生成语义场景图。 2. 游戏引擎把床头柜、椅子、抽屉、门转成可交互 actor。 3. 研究员人工修正关节轴、摩擦、质量和可抓取区域。 4. 世界模型在引擎中做 rollout,预测推、拉、拿、放的结果。 5. 高风险动作再交给 Isaac Sim 或真实机器人验证。 ### 场景 C:CrowdRoom Web 编辑器 1. 用户上传 RoomPlan 房间。 2. 后端转成 glTF/meshopt/Draco 轻量包。 3. Web 端以 Unity WebGL、Unreal Pixel Streaming 或 Three.js/R3F 展示。 4. 用户替换家具、材质、灯光,生成 Remix。 5. Remix 的变更以 overlay 形式保存,不复制底层几何。 --- ## 7. 技术实现建议 ### 7.1 Unreal 路线 适合做“酒店数字孪生高保真演示 + 复杂交互调试器”。 ```yaml 引擎: - Unreal Engine 5.x 核心模块: - USD Stage / Datasmith / glTF Importer - Chaos Physics - Control Rig / Sequencer - Pixel Streaming - Python Editor Script 输入: - USD: 主资产格式 - glTF/FBX: 轻量备选 - JSON: PRISM 场景图和语义属性 输出: - episode log - RGB-D/Segmentation 合成数据 - PRISM patch ``` 适合优先验证: - 高保真酒店大堂/走廊渲染; - 门、抽屉、椅子、行李车等刚体交互; - 研究演示和远程评审; - 复杂光照、反射、材质对感知模型的影响。 ### 7.2 Unity 路线 适合做“MVP 工具 + CrowdRoom 产品化编辑器 + 快速 ROS 原型”。 ```yaml 引擎: - Unity LTS 核心模块: - URP/HDRP - Addressables - ArticulationBody - ROS TCP Connector - WebGL / iOS / Desktop Build 输入: - glTF/FBX/USD 转换资产 - PRISM JSON scene graph 输出: - 用户编辑 overlay - 标注 patch - 简化 episode log ``` 适合优先验证: - RoomPlan 房间浏览器; - 家具/材质替换; - 简单移动机器人导航; - 低门槛标注工具。 ### 7.3 Isaac Sim 路线 适合做“机器人高可信仿真后端”,与游戏引擎形成互补。 ```yaml 核心定位: - 机器人传感器仿真 - URDF/USD 机器人资产 - 合成数据生成 - Isaac Lab / RL 训练 - ROS 2 联调 输入: - USD 场景 - URDF / CAD 机器人 - PRISM 语义图 输出: - 机器人任务评测 - 合成传感器数据 - sim-to-real 实验记录 ``` --- ## 8. 数据格式扩展 建议在 PRISM `SpatialNode` 上增加一个可选的 `engine_proxy` 字段: ```json { "spatial_node_id": "chair_305_01", "category": "chair", "pose_world": [0, 0, 0, 1, 0, 0, 0], "bbox": [0.55, 0.58, 0.92], "material": { "base": "fabric", "roughness": 0.75 }, "affordance": { "movable": true, "sittable": true, "pushable": true }, "engine_proxy": { "asset_uri": "assets/hotel_305/chair_305_01.usd", "render_mesh": "chair_305_01_high", "collision_mesh": "chair_305_01_convex", "rigid_body": { "mass_kg": 6.2, "friction": 0.6, "restitution": 0.05 }, "lod": ["high", "mid", "low"] } } ``` --- ## 9. MVP 计划:4 周验证闭环 | 周期 | 目标 | 交付物 | 验收标准 | |------|------|--------|----------| | W1 | 资产链路打通 | RoomPlan/ZED 场景 → glTF/USD → Unity 或 Unreal | 尺度误差 < 2%,坐标轴正确 | | W2 | PRISM 语义绑定 | 场景图 JSON 驱动物体高亮、查询、筛选 | 输入“床头柜”可定位对应 actor | | W3 | 物理代理 | 为门、椅子、抽屉生成 collider/rigid body/joint | 推拉动作无明显穿模 | | W4 | 任务回放 | 机器人轨迹回放 + episode log + PRISM patch | 可复现一次失败案例并回写 delta | MVP 只做一个客房或一段走廊,不追求完整酒店。优先证明“真实扫描资产能进入游戏引擎,并与 PRISM 双向通信”。 --- ## 10. 风险与对策 | 风险 | 表现 | 对策 | |------|------|------| | 扫描 mesh 不适合物理 | 面数过高、破洞、碰撞异常 | 渲染 mesh 与 collider 分离;自动 convex decomposition;人工修正工具 | | 坐标系统混乱 | RoomPlan、ROS、Unreal、Unity 轴向不一致 | 定义 `world_frame.md`,所有转换写单元测试 | | 游戏物理不够真实 | 摩擦、接触、关节误差导致 sim-to-real 差 | 游戏引擎只做快速筛选;关键实验进入 Isaac Sim 或真实机器人 | | 资产管线过重 | USD/glTF/FBX 来回转换丢属性 | USD 作为主格式,glTF 只做 Web 分发 | | 双引擎维护成本高 | Unreal、Unity、Isaac Sim 三套工程发散 | MVP 先选一个主前台;共享资产转换脚本和 PRISM schema | --- ## 11. 推荐决策 短期采用: 1. **Unity 优先做 MVP**:快速做出 RoomPlan 房间浏览、语义高亮、家具替换、简单物理交互。 2. **Unreal 做高保真展示分支**:用于酒店场景演示、复杂光照材质、远程评审。 3. **Isaac Sim 保持机器人仿真后端**:用于 ROS 2、传感器、RL 和严肃物理评测。 中期目标是形成一条统一管线: ```text 真实扫描 → PRISM 空间记忆 → USD/glTF 资产包 → 游戏引擎交互验证 → episode/patch 回写 → 世界模型训练 ``` 这样 WorldModel 项目会多出一个非常实用的“中间地带”:既不像纯研究代码那样难演示,也不像纯游戏场景那样脱离真实数据,而是把真实室内世界变成可运行、可编辑、可评测的 3D 交互实验场。 --- ## 参考资料 - NVIDIA Isaac Sim 官方介绍:说明 Isaac Sim 基于 Omniverse/OpenUSD,面向机器人仿真、测试、合成数据,并可导入 CAD、URDF 和真实捕获数据。 - Unreal Engine Physics 官方文档:Chaos Physics 覆盖刚体、约束、破坏、车辆、流体、网络物理等实时物理能力。 - Unreal Engine USD Stage 官方文档:Unreal 支持通过 USD Stage Actor 打开和编辑 USD 场景。 - Unity ROS TCP Connector 官方仓库:提供 Unity 与 ROS 收发消息、消息生成、ROSGeometry 等能力。