diff --git a/docs/ue5_led_context.md b/docs/ue5_led_context.md new file mode 100644 index 00000000..8a3d6fd0 --- /dev/null +++ b/docs/ue5_led_context.md @@ -0,0 +1,144 @@ +# 项目背景:UE5 + 3D LED 大屏展示系统 + +> 供其他 AI 快速了解项目背景和当前状态。 +> 最后更新:2026-04-14 + +--- + +## 一、项目定位 + +这不是一个普通的桌面地球应用,而是一套**领导演示用的 3D 沉浸式展示系统**。 + +核心逻辑: +- 态势感知数据(超算、海缆、卫星)是内容 +- 3D LED 大屏 + 实时渲染 + 动捕交互是"醋"——没有它,内容再好也只是普通屏幕 +- 主要受众:领导/决策层,注重视觉冲击力 + +--- + +## 二、硬件配置 + +| 硬件 | 规格 | 说明 | +|------|------|------| +| 3D LED 大屏 | 5.12m × 2.88m,P1.538mm,被动偏振式 | 观众戴无源 3D 眼镜(≤18g),60Hz 即可出稳定 3D | +| 渲染工作站 | 双路国产 X86 CPU + RTX 5090 32GB | 驱动 UE5 实时渲染 | +| 视频处理器 | 随屏配套(品牌待确认) | 接收 GPU 信号,驱动 LED 墙 | +| 动捕摄像头 | RGB 摄像头 ×2,4K,直连电脑 | 无穿戴姿态识别 | +| 音响 | 解码功放 + 吸顶喇叭 ×5 + 低音炮 | 配套 | + +--- + +## 三、软件架构 + +``` +摄像头(×2,直连) + ↓ 动捕插件(供应商提供 UE5 插件) +UE5 主程序(我们开发) + ├── Cesium 地球(实时渲染) + ├── 超算数据点(可交互) + ├── 其他可交互物件 + └── 立体渲染输出 + ↓ 视频信号(格式待确认) + 视频处理器(随屏配套) + ↓ LED 驱动信号(行偏振) + 5m 被动偏振 3D LED 大屏 +``` + +--- + +## 四、分工 + +| 部分 | 谁做 | 状态 | +|------|------|------| +| LED 屏体 + 视频处理器 | 屏幕供应商 | 采购中 | +| 动捕插件(UE5 插件形式) | 动捕供应商 | 待交付 | +| UE5 基础工程(关卡+角色+动捕绑定) | 动捕供应商 | 待交付 | +| 地球场景 + 数据可视化 + 交互逻辑 | 我们(本项目) | 开发中 | +| 后端数据接口 | 我们(本项目) | 已完成 | +| 其他 9 个定制 3D 资产和动画 | 3D 内容供应商 | 采购中 | + +--- + +## 五、动捕交互方式 + +**交付形式(已确认)**: +- 供应商给我们**完整 UE5 工程**,包含: + - 视频动捕插件 + - 已配好绑定和重定向的 3D 角色 + - 3D 模型和动画资产 + - 接两台摄像头即可直接运行 +- **我们的任务**:把他们工程的内容(插件 + 角色 + 资产)**迁移进我们的 `ue_client/` 工程**,然后把角色动作映射到地球操作 + +**待确认**:角色动作的触发点是什么形式? +- 蓝图 Custom Event(如 `OnGestureRotate`)? +- AnimNotify? +- 需要我们自己判断骨骼姿态? + +**交互目标(一期)**: +1. 手势旋转地球 +2. 手势缩放地球 +3. 手势指向/确认 → 选中数据点,弹出信息卡 +4. 鼠标作为备用输入(始终可用) + +--- + +## 六、立体渲染 + +**待确认**: +1. 供应商基础工程里是否已配好立体渲染输出? +2. 如果没有:视频处理器接受什么格式?(Side-by-Side / Top-Bottom / 其他) +3. 给供应商的文件形式:UE5 工程 / .exe / 视频文件 / 直连实时输出? + +**已准备**:`StereoRenderingManager.h/.cpp` 支持运行时切换 SbS/TbB,格式确认后直接启用。 + +--- + +## 七、已完成的代码 + +### 后端 (`backend/app/api/v1/ue_data.py`) +- `GET /api/v1/ue/status` — 健康检查 +- `GET /api/v1/ue/compute-points` — TOP500 超算(平铺 JSON) +- `GET /api/v1/ue/landing-points` — 海缆登陆点 +- `GET /api/v1/ue/cables` — 海缆路由几何 +- `GET /api/v1/ue/satellites` — 卫星 TLE 数据 + +### UE5 C++ (`ue_client/Source/PlanetClient/`) + +| 文件 | 功能 | +|------|------| +| `PlanetDataTypes.h` | FComputePoint 等数据结构 | +| `PlanetDataManager` | HTTP 拉取 + mock 数据 + 生成 Actor | +| `ComputePointActor` | 超算点 Actor,三态材质(正常/悬停/选中)| +| `InteractiveObjectBase` | 所有可交互物件的基类 | +| `GlobeInteractionComponent` | 拖拽旋转地球(改 Cesium 经纬度原点)+ 缩放,带惯性 | +| `StereoRenderingManager` | 立体渲染开关,SbS/TbB,IPD 可调 | +| `MotionCaptureInterface.h` | 动捕接口抽象(待用插件 API 替换实现)| +| `PlanetPlayerController` | 统一处理鼠标 + 动捕输入 | +| `PlanetGameMode` | 场景入口 | + +### 文档 +- `docs/ue_client_setup_guide.md` — 编辑器操作 step-by-step 指南 +- `docs/ue_todo.md` — 待供应商回复的 TODO +- `docs/ue5_mvp_fused_plan.md` — 完整实施方案(v3.0) + +--- + +## 八、交付时间线 + +| 时间 | 内容 | 状态 | +|------|------|------| +| 本周末前 | 动捕供应商:含动捕插件 + 3D 角色(绑定/重定向已配好)的基础 UE5 工程 | 等待中 | +| 之后尽快 | 动捕供应商:动画资产(复制进 Content/ 即可直接调用) | 等待中 | +| TBD | LED 屏供应商:视频处理器接受的 3D 信号格式(或直接技术支持对接) | 等待中 | + +**拿到基础工程后可立即做**:迁移插件和角色,接摄像头做动捕调试,然后对接动作→地球操作映射。 + +**双目 3D 显示**:供应商可提供技术支持,等视频处理器到位后直接对接。 + +--- + +## 九、当前阻塞项 + +1. **动捕基础工程**(本周末前到)→ 迁移内容,确认动作触发方式,完成交互对接 +2. **动画资产**(尽快)→ 复制入 Content/,在场景中引用 +3. **3D 显示格式**(有供应商技术支持)→ 配置 `StereoRenderingManager` diff --git a/docs/ue_todo.md b/docs/ue_todo.md index 0293bfa0..835eddf3 100644 --- a/docs/ue_todo.md +++ b/docs/ue_todo.md @@ -29,30 +29,45 @@ ue_client/Source/PlanetClient/StereoRenderingManager.cpp — EnableStereo() 函 --- -## TODO-2:动捕插件 API 文档 +## TODO-2:动捕角色接入 -**已确认**:动捕识别以 UE5 插件形式交付,摄像头直连电脑,不走 Live Link 转接。 +**已确认**: +- **本周末前**:供应商交付含动捕插件 + 3D 角色(已配好绑定和重定向)的基础 UE5 工程 + - 接入两台摄像头,4080 以上显卡即可直接运行动捕调试 +- **之后尽快**:动画资产单独交付,复制到工程 Content/ 目录即可直接调用 +- **我们的任务**:把他们工程内容迁移进 `ue_client/`,把角色动作映射到地球操作 -**等待信息**:供应商提供插件文件 + API 文档后,需要知道: +--- + +### 阶段 A:拿到基础工程后(本周末) + +**迁移步骤**: + +1. **迁移动捕插件** + - 从供应商工程 `Plugins/` 拷到 `ue_client/Plugins/` + - `PlanetClient.uproject` 的 `Plugins` 数组添加插件条目(`Enabled: true`) + - `PlanetClient.Build.cs` 的 `PublicDependencyModuleNames` 加插件模块名 + +2. **迁移角色** + - 把角色 Blueprint、动画、骨骼网格从供应商 `Content/` 拷到 `ue_client/Content/` + - 在关卡里放置角色 Actor,确认摄像头接入后能正常驱动 + +3. **接入动作触发(关键,看到工程后确认方式)**: | 需要确认的内容 | 用途 | |-------------|------| -| 插件模块名称(`ModuleName`) | 加入 `PlanetClient.Build.cs` 依赖 | -| 手势事件的 C++ 类名 / 委托名 | 替换 `MotionCaptureInterface.h` 里的抽象接口 | -| 手势集合(能识别哪些手势) | 填写 `EMotionGesture` 枚举,配置 `FMotionActionMapping` | -| 是否支持持续输出旋转增量 | 决定旋转地球用"持续增量"还是"离散手势触发" | -| 数据回调是 C++ 委托还是 Blueprint 事件 | 决定绑定方式 | +| 角色动作怎么暴露给外部? | Blueprint Custom Event / AnimNotify / 骨骼姿态变量? | +| 手势集合有哪些? | 填写 `EMotionGesture` 枚举,配置 `FMotionActionMapping` | +| 是否持续输出旋转增量? | 旋转地球用"持续增量"还是"离散手势触发" | +| 插件模块名称(`ModuleName`)| 加入 `Build.cs` 依赖 | -**拿到插件后的接入步骤(我来做)**: -1. 把插件放到 `ue_client/Plugins/` 目录 -2. 在 `PlanetClient.uproject` 里启用插件 -3. 在 `PlanetClient.Build.cs` 里加插件模块依赖 -4. 用插件实际 API 实现 `UMotionCaptureReceiver` 子类 -5. 在 `PlanetPlayerController::BeginPlay` 里取消注释 `BindMotionCaptureEvents()` +**拿到工程后(我来做)**: +- 用插件实际 API 实现 `UMotionCaptureReceiver` 子类 +- 在 `PlanetPlayerController::BeginPlay` 里取消注释 `BindMotionCaptureEvents()` **代码位置(接口已预留)**: ``` -ue_client/Source/PlanetClient/MotionCaptureInterface.h — 基类和手势枚举 +ue_client/Source/PlanetClient/MotionCaptureInterface.h — 基类和手势枚举 ue_client/Source/PlanetClient/PlanetPlayerController.cpp — BindMotionCaptureEvents() ue_client/Source/PlanetClient/PlanetClient.Build.cs — TODO 注释处加插件模块名 ue_client/PlanetClient.uproject — Plugins 数组加插件条目 @@ -60,6 +75,13 @@ ue_client/PlanetClient.uproject — Plugins 数组加 --- +### 阶段 B:动画资产到位后 + +- 把供应商提供的动画资产直接复制到 `ue_client/Content/` 对应目录 +- 在 `PlanetDataManager` / 场景 Actor 里引用这些资产即可调用 + +--- + ## 答复到位后的操作清单 拿到答案后告诉我,我来: