Appearance
程序化动作脚穿透地面
状态: 🟢 已修复
日期: 2026-07-11 严重程度: 🔴 P1(渲染错误,用户可见) 影响范围: frontend/src/scene/motion/perception.ts(脚部跟随)+ scene.ts(地面检测) 发现方式: 用户观察 修复方案: ADR-085 脚部地面跟随,每帧射线检测 + 腿部骨骼链传播
问题描述
程序化生成的动作(idle、autodance)没有地面碰撞检测。
角色的脚在某个动作帧里穿过了地面网格——脚掌在地板下面,小腿在地板上面。
MMD 动作不会这样——MMD 的 IK 系统会自动修正。但程序化动作只有关键帧:骨骼位置、旋转、时间戳。没有碰撞检测,没有 IK 修正。
根因分析
程序化动作是纯数学生成——根据节拍、频率、参数,生成骨骼关键帧序列。
地面碰撞检测需要物理引擎(WASM Bullet)或 IK 系统。但程序化动作生成器不查物理引擎,也不查 IK。
所以脚的位置只取决于"生成的参数",不取决于"地面在哪"。
为什么没有暴露
程序化动作的地面问题是"动作帧的局部问题"——大多数帧脚都在地面以上,只有少数帧脚的位置低于地面。用户需要"盯着脚看"才能发现。
而且,大多数 PMX 模型本身不带 IK,MMD 动作也不会触发程序化动作生成器——所以这个 bug 只在"启用程序化动作"时出现。
修复方案
ADR-085:脚部地面跟随。
每帧从脚骨位置向下发射射线,检测与 ground 网格的交点。如果脚低于地面,计算差值,往上传播到腿部骨骼链(小腿→大腿→盆骨)。
跳跃时禁用地面跟随——检测脚骨的 Y 速度,大于阈值说明在向上跳。
教训
- 程序化动作是纯数学,地面碰撞检测是纯物理 — 两者连接,需要一个"地面感知"层
- "大多数帧没问题"不等于"没问题" — 用户盯着脚看时,少数帧的错误就很明显