# T-WEB-013 动作内部标准与模型骨骼重绑定 - **状态**: done - **依赖**: T-WEB-006 / T-WEB-012 - **文档**: v1.6 §4.10 - **契约**: `skeleton-topology 0.2.0`、`data-models 0.7.0` ## 目标 1. **动作内部标准**:所有动作(BVH / VMD / FBX / glTF)统一预处理成 MediaPipe 33 点关键点序列(`mediapipe33@0.1.0`),客户端只认这一种; 2. **模型骨骼重绑定**:任意命名风格的模型都能被关键点驱动 —— 按**名字**映射到 canonical humanoid 骨骼,而不是要求模型符合某一种命名规范。 ## 方案 ### 动作内部标准 `preprocess.service.ts` 按扩展名分派解析器,统一产出 NDJSON 关键点序列 + 9 个关节角特征(108 维),与 Android 端推流结构完全同构 —— 因此客户端 DTW 的两侧输入是同一套特征。 ### 骨骼重绑定 | 项 | 做法 | |--|--| | 归一化 | `normalizeBoneName()`:保留 CJK 与假名(**不能再只留 `a-z0-9`**),全角 ASCII 折叠(`足IK` → `足ik`) | | 候选表 | `HUMANOID_CANDIDATES` 覆盖 VRM/VRoid、Mixamo、MMD 日文名、中文常见名 | | 生成而非手写 | Godot 端 `src/model/humanoid_map.gd` 的 CANDIDATES **由服务端表生成**,并有跨端一致性测试 | | 覆盖度 | `coverage()` / `missing_bones()` 暴露给审核界面与客户端 | > **踩坑记录**:第一版 `normalizeBoneName()` 只保留 `[a-z0-9]`,把 CJK 名字 > 整个抹成空串,导致 MMD 模型 humanoid 覆盖 **0/22**。修复后实测 > 奥黛塔 **21/22**、初音未来 **19/22**,两者 `drivable = true` 且 VRM 正常产出。 ## 验收 | 验收项 | 结果 | |--|--| | MMD(日文骨骼名)模型可驱动 | ✅ 实测 21/22、19/22 覆盖;客户端可正常驱动 | | Godot 端候选表与服务端一致 | ✅ 一致性测试(跨仓库生成 + 校验) | | 动作统一为 33 点 | ✅ `keypoint_format = mediapipe33@0.1.0`;Android 端推流同构 |