Skip to content

手部独立控制模块(左手/右手)

系统概览

左手/右手独立控制模块。每侧提供手腕旋转(pitch/yaw/roll)、手臂位置偏移(handPosX/Y/Z)、手指预设(fingerPreset + fingerIntensity)三组参数。

核心职责

  • hand-modules.ts — 工厂模式,createHandModuleFactory(cfg) 生成左右手模块。
  • 手腕旋转:静态 setBoneOverride 写入手首骨骼。
  • 手臂位置:帧钩子 registerBoneOverrideFrameHook 每帧驱动,FK 父根骨平移 + IK 重解增强。
  • 手指姿势:5 指 × 3 节静态 bake,预设 × 强度控制卷曲程度。

对外 API(节选)

  • LEFT_HAND_DEF: ModuleDef — 左手模块定义(priority=1)。
  • RIGHT_HAND_DEF: ModuleDef — 右手模块定义(priority=1)。

与其他子系统关系

  • 注册表:./registry.ts(通过 getBuiltinModuleDefs() 注册)。
  • 骨骼覆盖:../bone-override.tssetBoneOverride + setBoneOverridePosition + registerBoneOverrideFrameHook)。
  • 帧钩子管理器:createFrameHookManager()./module-base.ts)。
  • 模块基类:createModuleBase + createModuleShell + prepareBake
  • 骨骼候选:@/motion-algos/proc-motion-sharedBONE_ARM_IK_L/R_CANDIDATESBONE_SHOULDER_L/R_CANDIDATES)。

管理骨骼

  • 手腕:左手首 / 右手首
  • 肩根骨:左肩 / 右肩
  • 手指:左/右 + 5 指名 + 6 节后缀 = 30 候选骨骼

不变量

  • 左右手各自持独立 _handFrameHooks Map(按 modelId 键控,每侧只注册一次)——避免共享同一 Map 时 createEnsureActivehas(modelId) 幂等检查误判,导致后启用一侧的手臂位置偏移帧钩子永不注册(round-12 P1 修复)。
  • 手臂 IK 缓存 _armIkCache per-model 惰性查找。
  • disable 时注销帧钩子 + clearBoneOverride 仅清 owned 骨骼。