跳转到内容

Live2D 动画与映射

这篇文档对应的是 AnySoul 现在真实在跑的 Live2D runtime:可复用 clips、由 rule / base behavior 持有优先级、带 scope 的 base behaviors,以及按 priority tier 结算的参数仲裁。

把系统理解成 3 层最清楚:

  1. Clips:定义可复用动画资产
  2. Rules:定义什么条件下播放这些 clips
  3. Base Behaviors:为 idleactive 两个 scope 调度长时背景层

建议把 Full Editor 当成这三者的主编辑入口。

运行时大致按下面的顺序结算:

  1. Parameters 里作者设定的中性姿态
  2. 可选的 legacy idle motion 参与
  3. 当前激活的 base behavior scopeidleactive
  4. 所有当前命中的 rules
  5. lip sync / focus dispatch

对同一个参数来说,结算关键点是:

  • 先按 priority tier 分层
  • 更高层优先于更低层
  • 同一层里,先算 Multiply / Add
  • 然后 Override 消耗剩余权重
  • 如果高层 Override 已经满权重,低层就没有机会再影响这个参数

这也是为什么低优先级的 base noise 不应该再漏进一个高优先级“头部固定”rule 里。

Clip 是可复用资产。一个 clip 可以被很多 rules 或 base behaviors 反复引用。

运行时优先级现在不属于 clip 资产本身。
优先级属于:

  • Rule
  • Base Behavior

如果你在旧文档或旧配置里看到“clip priority”,请把它理解成旧术语。

  • Add Clip 手工创建
  • Create From Expression 导入 .exp3.json
  • Import Motion As Clip 导入 .motion3.json
  • Template 生成常见模板
  • 参数轨道
  • 关键帧
  • 播放模式
  • end behavior
  • release 配置
  • 每条轨道自己的 blend mode
  • 每条轨道自己的 modifier
模式适合场景
One Shot反应动作、短手势、短表情变化
Loop持续状态,比如 speaking cycle、ambient motion
Repeat N需要精确次数的节奏,比如双点头、三次眨眼

Clip 还会定义:

  • bound to trigger duration,还是 complete even if trigger ends
  • 轨道在结束时是 stop 还是 hold then release
  • release 需要多久

每个 clip 本质上都是一组参数轨道。

blend mode 是轨道级的选择:

模式行为常见用途
Override接管该参数表情姿态、动作姿态、“头部固定”这类硬覆盖
Add在现有结果上加偏移呼吸、轻微摇摆、附加动势
Multiply按比例放大/缩小当前值特殊效果、幅度整形

Add 只适合那种真的应该叠层存在的运动。如果某段 motion 在更强 clip 出现时必须停掉,那就应该靠合适的优先级层级 + Override 解决。

Modifier 会在关键帧插值之后继续加工:

keyframed value -> modifier chain -> final track write

当前支持:

  • Wiggle
  • Drift
  • Sine
  • Pulse
  • Spring
  • Loop
  • Noise
  • Clamp

你可以用 inspector 里的 Mod ON/OFF 对比“纯关键帧”和“最终带 modifier 的结果”。

虚拟参数:

  • __focus_x__
  • __focus_y__

可以像普通轨道一样被动画化,非常适合做 gaze wander。

Rules 把运行时状态连接到 clips。

  • emotion
  • action
  • tool call
  • text
  • thinking
  • idle

对于 text 规则,运行时还可以区分 message text 和 thinking text。最好的验证方式不是猜,而是直接用 Sequence Tester。

AnySoul 现在是 all-match

  • 所有满足条件的 rules 都会触发
  • 一条 rule 里可以有多个 clip group 并行播放
  • 多条 rule 也可以同时激活

所以参数所有权设计非常重要。

Rule 自己拥有:

  • priority0 idle1 normal2 emotion3 force
  • 一个或多个 clip groups
  • 每个 group 的 selection mode
  • 每个 group 的 weight
  • 每个 group 的 timeScale

Clip group 是一条 rule 选择 clip 变体的方式:

  • group 与 group 之间并行播放
  • 一个 group 内部可 randomsequential
  • 每个 group 可用 weight 调整播放强度
  • 每个 group 可用 timeScale 调整速度

Base Behaviors 是当前系统里长时背景层的标准做法。

每个 base behavior 都属于一个 scope:

  • Idle Base
  • Active Base

运行时只会同时启用一个 scope,这取决于当前是否有非 idle 的 rule 命中。

Base behavior 当前支持:

  • Loop one clip
  • Pick one per idle session
  • Random playlist

并且可以配置:

  • cycle transition duration
  • handoff transition duration
  • scope transition duration
  • priority

如果模型自带 legacy idle motion,你也可以让它参与 idle-base 播放。这是在 Rules 区域里配置的,不是在 clip 轨道里配置的。

Sequence Tester 是现在验证运行时行为最快的方式,不需要等真实聊天流入。

你可以模拟:

  • emotion
  • action
  • tool call
  • text
  • thinking
  • 显式 idle step

它会展示:

  • 当前状态
  • 当前 base scope
  • 当前是 base only 还是 base + rule overlay
  • 命中的 rules
  • 命中的 base behaviors

在 sequence 播放过程中,inspector 里的 Parameter Control 还能直接看到:

  • 哪个 writer 当前控制了这个参数
  • 哪些 writer 被压制了

inspector 里的 Preview Base 可以切换 clip / rule 预览时叠加的底层:

模式含义
Baseline只叠在作者基线姿态上
Idle Base叠在 idle-scope base behavior 上
Active Base叠在 active-scope base behavior 上

调细小 overlay 时,这个开关非常关键。

  • 呼吸、视线游移、待机微摆放进 Base Behaviors
  • 反应动作、明确状态姿态放进 Rules
  • 想阻止低优先级运动漏进来,用 Override
  • 想保留可叠层的次级运动,用 Add
  • 如果“单独预览正确,runtime 不对”,优先检查:
    • rule priority
    • base behavior priority
    • track blend mode
    • preview base mode
    • parameter-control inspector