Communitygithub.com

murathany7/character-2d

在视频中为 2D 卡通角色或吉祥物制作动画——支持代码绘制的 SVG 骨骼、设计师的 Lottie 文件或 Rive 文件。涵盖部位命名、待机/眨眼/说话/挥手/跳跃、语音口型同步(使用 Rhubarb 嘴形,也适用于仅提供 PNG 的吉祥物),以及品牌吉祥物规则。

character-2d 是什么?

这是一个针对 2D 角色动画的 AI 助手技能,适用于开发者在视频中为卡通角色或品牌吉祥物制作生动的动画。该技能支持三种主流动画格式:SVG 骨骼动画(通过 `engines/svg-rig.js` 引擎实现)、Lottie 文件(由设计师提供)以及 Rive 文件。对于 SVG 骨骼,开发者可以轻松定义身体部位命名规则(如 `#body`、`#eyes`、`#mouth-closed` 等),并通过链式方法调用实现待机、眨眼、说话、挥手和跳跃等动作。口型同步功能特别强大:支持基于 Rhubarb 语音识别的高级口型同步(多嘴形 A-H),也提供简单的“嘴唇拍动”模式;甚至能为仅存为 PNG 的角色图片动态绘制嘴部。技能还包含品牌吉祥物规则处理、动作质量检查(如眨眼间隔、动作预期与回弹)以及跨平台兼容性。适用于 Cursor、Claude Code 等 AI 编码代理平台。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/murathany7/reel-studio/tree/HEAD/.agents/skills/character-2d

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

2D 角色动画

首先阅读品牌的吉祥物规则(brands/<slug>/README.md,吉祥物部分)。品牌吉祥物必须严格基于品牌自有文件绘制;切勿凭记忆重绘。

SVG 骨骼(无设计文件)

  1. 将角色绘制为内联 <svg>,使用品牌配色中的简单图形。命名部位:#body、#eyes、#mouth-closed、#mouth-open、#arm-l、#arm-r(可省略任意部位)。
  2. const c = SvgRig(svgEl) 然后链式调用:.idle(from, to)、.blink([t…])、.talk(from, to)、.wave(t)、.hop(t)。
  3. 手臂以其所属矩形的内下角为轴心旋转。如果手臂摆出身体范围,请在手臂上设置 data-pivot="x% y%"。
  4. 播放配音:使用下一节的口型同步。若没有 Rhubarb,可使用简化的嘴唇拍动模式:单词起始时间由 scripts/transcribe.sh audio/vo.wav audio/vo 生成,传入 .talk(0, 0, { beats: [...] })。
  5. 复用:角色一旦获批,将其 SVG 保存至 brands/<slug>/assets/characters/ 并添加到品牌 README 中。

口型同步(角色朗读配音)

  1. 每句配音线索:scripts/lipsync.sh audio/vo.wav audio/vo.visemes.json --dialog audio/vo.txt(使用 Rhubarb 口型同步;脚本内有安装说明)。使用批准的文字稿作为对话文件。时间单位为秒。
  2. 在合成画面中加载 <script src="../audio/vo.visemes.js"> 和 <script src="/engines/lipsync.js">。
  3. **SVG 骨骼:**将嘴形绘制为 #mouth-A 到 #mouth-H,以 #mouth-closed(或 #mouth-X)作为静态嘴。A(嘴唇紧闭)、B(微张,露齿)、C(张开)、D(大张)、E(O 形)、F(OO 形)承担大部分口型;G(F/V 音)和 H(L 音)若未绘制则回退到 A 和 C。然后调用 .lipsync(LipSync.cues("vo.visemes"), { offset: <配音开始时间> }),每句一行。对同一行不要同时使用 .talk() 和 .lipsync()。示例参考 examples/engines-demo/index.html。
  4. 仅以图片形式存在的吉祥物(品牌的 PNG 图片):使用 LipSync.mountMouth(wrapper, { cx, cy, w, aspect, shapes: LipSync.mouthSet({ ink, cover }) }) 在图片上绘制嘴部(cover 为面部颜色,在说话时隐藏图片自身的嘴部;静止时显示图片的嘴)。cx、cy、w 为图片的比例分数:测量一次,在几个提示点检查静止帧,并将数值记录在品牌 README 中(吉祥物部分)。然后调用 LipSync.addToTimeline(Studio.tl, cues, mouth, { offset })。
  5. 在品牌吉祥物上绘制的嘴部属于新 artwork:发布前必须经品牌所有者批准。
  6. 说话时保持面部生动:每 2-4 秒眨眼一次,重音词上微微点头。使用 LipSync.talking(cues, t, offset) 判断角色是否正在说话。
  7. 质量检查:在提示点附近检查静止帧(每个嘴形是否与声音匹配?),然后完整听一遍混合画面。

规则及 3D 部分:engines/README.md,口型同步部分。

Lottie(设计文件)

使用 Studio.lottie(el, "/brands/<slug>/assets/lottie/<file>.json", { start, loop, speed })。在运行时之前加载 /core/node_modules/lottie-web/build/player/lottie.min.js。检查文件是否使用了 lottie-web 无法渲染的表达式或效果(渲染一帧,与设计师预览对比)。

Rive(设计文件)

使用 riveLayer(el, "/brands/<slug>/assets/<file>.riv", { animation | stateMachine, start, loop, inputs })(来自 engines/rive.js)。时间轴(animation)直接根据 t 设置姿态。状态机从 0 开始按帧率逐步推进,因此输入时间值:inputs: [{ at: 1.2, name: "wave" }, { at: 2, name: "mood", value: 2 }](无 value 则为触发)。按两种顺序渲染几帧(先 --workers 1,然后 --workers 2 时间反转)并检查 md5 值是否匹配。examples/reel-layer/rive.html 是一个可运行的检查页面。

角色动画技巧

  • 动作前要有预期(跳跃前轻微压缩),动作后要有回弹(back.out 动画曲线)。
  • 每 2-4 秒不规则间隔眨眼。静止不动的角色看起来死气沉沉。
  • 姿态持续时间要足够长以便阅读(手机上 ≥ 0.4 秒)。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能