arm.js 4 KB
// arm.js — arm_l / arm_r 两条手臂轨道动作。
//
// 几何标定(踩坑换来的,照搬保留):人物面向一个方向,故左右臂朝「同一屏幕方向」收,
// arm_l 与 arm_r 用相同旋转量(非镜像)—— pocket / raise / wave / punch 均如此,
// 双手同动时两臂平行。arm_l 在屏幕左、正角指向左;arm_r 在屏幕右、负角指向右。

/** @type {Record<string, import('../types.js').AnimationClip>} */
export const ARM_CLIPS = {
  // ---- 左臂(屏幕左)----
  'arm_l.down': {
    id: 'arm_l.down', track: 'arm_l', kind: 'pose', duration: 0,
    bones: { upper_arm_l: [{ t: 0 }], lower_arm_l: [{ t: 0 }] },
  },
  // 插兜:两手一起收向朝向侧的胯兜。
  'arm_l.pocket': {
    id: 'arm_l.pocket', track: 'arm_l', kind: 'pose', duration: 0,
    bones: { upper_arm_l: [{ t: 0, drot: -22 }], lower_arm_l: [{ t: 0, drot: 30 }] },
  },
  'arm_l.raise': {
    id: 'arm_l.raise', track: 'arm_l', kind: 'pose', duration: 0,
    bones: { upper_arm_l: [{ t: 0, drot: 158 }], lower_arm_l: [{ t: 0, drot: 6 }] },
  },
  // 指人分「指左/指右」:基准朝向下,指左=伸向屏幕左,指右=伸向屏幕右。
  'arm_l.point_left': {
    id: 'arm_l.point_left', track: 'arm_l', kind: 'pose', duration: 0,
    bones: { upper_arm_l: [{ t: 0, drot: 80 }], lower_arm_l: [{ t: 0, drot: 8 }] },
  },
  'arm_l.point_right': {
    id: 'arm_l.point_right', track: 'arm_l', kind: 'pose', duration: 0,
    bones: { upper_arm_l: [{ t: 0, drot: -92 }], lower_arm_l: [{ t: 0, drot: -8 }] },
  },
  'arm_l.wave': {
    id: 'arm_l.wave', track: 'arm_l', kind: 'loop', duration: 600,
    bones: {
      upper_arm_l: [{ t: 0, drot: 150 }, { t: 1, drot: 150 }],
      lower_arm_l: [{ t: 0, drot: -22 }, { t: 0.5, drot: 24 }, { t: 1, drot: -22 }],
    },
  },
  // 挥拳:预备(向后内带)→ 向行进/朝向方向水平前冲伸直 → 收回。左右臂同方向。
  // 基准朝向(facing=right 状态)下出拳朝屏幕左(-x),与 leg.walk 行进方向一致;facing 镜像翻到另一侧。
  'arm_l.punch': {
    id: 'arm_l.punch', track: 'arm_l', kind: 'oneshot', duration: 460,
    bones: {
      upper_arm_l: [{ t: 0, drot: 0 }, { t: 0.2, drot: -18 }, { t: 0.5, drot: 80 }, { t: 0.64, drot: 80 }, { t: 1, drot: 0 }],
      lower_arm_l: [{ t: 0, drot: 0 }, { t: 0.2, drot: -28 }, { t: 0.5, drot: 6 }, { t: 0.64, drot: 6 }, { t: 1, drot: 0 }],
    },
  },

  // ---- 右臂(屏幕右)----
  'arm_r.down': {
    id: 'arm_r.down', track: 'arm_r', kind: 'pose', duration: 0,
    bones: { upper_arm_r: [{ t: 0 }], lower_arm_r: [{ t: 0 }] },
  },
  'arm_r.pocket': {
    id: 'arm_r.pocket', track: 'arm_r', kind: 'pose', duration: 0,
    bones: { upper_arm_r: [{ t: 0, drot: -22 }], lower_arm_r: [{ t: 0, drot: 30 }] },
  },
  // 举手:与 arm_l.raise 相同旋转量(左右同方向,非镜像),双手同举时两臂平行。
  'arm_r.raise': {
    id: 'arm_r.raise', track: 'arm_r', kind: 'pose', duration: 0,
    bones: { upper_arm_r: [{ t: 0, drot: 158 }], lower_arm_r: [{ t: 0, drot: 6 }] },
  },
  'arm_r.point_left': {
    id: 'arm_r.point_left', track: 'arm_r', kind: 'pose', duration: 0,
    bones: { upper_arm_r: [{ t: 0, drot: 92 }], lower_arm_r: [{ t: 0, drot: 8 }] },
  },
  'arm_r.point_right': {
    id: 'arm_r.point_right', track: 'arm_r', kind: 'pose', duration: 0,
    bones: { upper_arm_r: [{ t: 0, drot: -80 }], lower_arm_r: [{ t: 0, drot: -8 }] },
  },
  'arm_r.wave': {
    id: 'arm_r.wave', track: 'arm_r', kind: 'loop', duration: 600,
    bones: {
      upper_arm_r: [{ t: 0, drot: 150 }, { t: 1, drot: 150 }],
      lower_arm_r: [{ t: 0, drot: -22 }, { t: 0.5, drot: 24 }, { t: 1, drot: -22 }],
    },
  },
  'arm_r.punch': {
    id: 'arm_r.punch', track: 'arm_r', kind: 'oneshot', duration: 480,
    bones: {
      upper_arm_r: [{ t: 0, drot: 0 }, { t: 0.2, drot: -18 }, { t: 0.5, drot: 80 }, { t: 0.64, drot: 80 }, { t: 1, drot: 0 }],
      lower_arm_r: [{ t: 0, drot: 0 }, { t: 0.2, drot: -28 }, { t: 0.5, drot: 6 }, { t: 0.64, drot: 6 }, { t: 1, drot: 0 }],
    },
  },
}