关于 scenario-maya-animation
面向动画师的 Maya 动画技能,指导镜头规划、Blocking、曲线调整、面部动画和润色。它将基于帧的分析与 playblast 或无头图像审阅结合起来。
主要功能
- 01按帧规划节拍与时序
- 02为各控制器制作 Blocking
- 03调整并评估动画曲线
- 04分析轨迹、接触与停顿
- 05制作面部和口型同步动画
适用场景
- 01规划并制作角色镜头 Blocking
- 02检查跳跃时序和落地动作
- 03调整动作衔接与动态停顿
- 04制作对白和面部动作
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-maya-animation安装后在 Claude Code 中输入/scenario-maya-animation确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/mx_anim.py详细介绍
Maya 动画(动画师)
专业动画意味着每一帧都是一个选择:姿势要能从摄像机视角看成清晰的画面,有意安排停顿和骤动,设计好间距,通过阻力和及时刹停表现重量。由大到小推进(故事、身体、面部、细节);若当前阶段还不清晰,就不要添加细节。Agent 无法拖动时间轴逐帧查看,因此要先测量(世界空间和屏幕空间轨迹、间距、停顿、接触、弹道拟合、重叠延迟),再查看 playblast 或无头模式下的序列图,然后才能判断是否完成。如果这里提到的同级技能不在你可用的技能中,请让用户安装(npx skills add scenario-labs/skills --skill <name>);若处于无人值守状态,则依据工具架构继续操作,并标明这一缺口。
必备背景: scenario-maya-expert(执行通道、审核循环、2027 版本陷阱)。
工具包:scripts/mx_anim.py。其分析和图像层为纯 Python,并可离线运行。
立场(专家经验的关键差异)
- 按镜头选择工作流程;信息到位时,阻挡阶段就结束。 Neistadt:表演采用姿势到姿势,流畅动作采用逐帧直推或极限姿势;当五类关键姿势都已具备时,阻挡就完成了(主姿势、预备动作、过冲和跟随动作、过渡姿势、停顿)。Elver 从一开始就用样条处理物理镜头;Camporota 先用两个方块验证时机。
- Maya 是“世界上最差的中间帧制作工具”(Newman)。 快速动作要多打关键帧,慢速部分每隔 2 到 4 帧打一次。样条是否就绪,要通过测试判断:将该范围转为样条并播放;如果动作变糊,就切回阶梯模式并添加更多姿势。原生的 Set Key 会重塑相邻曲线(Wade):插入关键帧,用曲线差异证明效果,并在转样条前为每个控制器同步关键帧。
- 重量通过阻力、释放和及时刹停来表现。 Wade:先表现角色所承受的阻力(延迟、从静止开始加速),再表现它的力量;力量要通过帧数体现。Elver:上下起伏太多会像气球,而不像有重量;重量表现为坠落后突然稳稳接住、挤压时停留更久,并带有残余抖动。沉重物体在空中要符合重力 [新增物理特性];Wade 的加权顶点会增加滞空感,适用于轻盈或卡通化的身体。
- 脚和脊柱能体现每一次重心转移(跳跃、单脚跳、落地、抬举)。 Camporota:每次下蹲都要做脚部滚动动画,以表现压缩感;大幅下落时,脊柱要落后于臀部,只有手臂下落;第一遍要把预备动作做得过头,再往回收;触地时要“几乎在一帧内”变平。Elver:离地后的第一帧,脚尖要指回离地的位置。
- 在摄像机空间中以实际速度判断。 Elver:运动轨迹可能显示出完美的 3D 弧线,但屏幕上的效果仍可能失败。Lazare:观众的目光会被幅度最大的动作吸引,因此非焦点角色应“恰当地保持静止”。通过镜头摄像机投影轨迹;在查看任何指标之前,先读 playblast。
- 基础层就是动画;动作捕捉数据很宝贵。 Newman:动画层是一个有时间限制的实验层,带有标记关键帧和保护关键帧;不要在其上清理曲线,用 Smart Bake 合并,然后再清理(Elver:只用于后期整体调整或添加颤动,然后烘焙)。修改动作捕捉数据时,只修复指定的问题,否则最终会变成“既不是手动关键帧动画,也不是动作捕捉”;合并后先使用 Euler Filter,再将关键帧删减到只剩极限姿势。
- 口型同步要匹配声音,而不是单词。 Santos:先只做下颚动画(木偶式表演),然后再做五个主要控制点(下颚、嘴角两个、上唇和下唇),即可覆盖 90% 的需求;要根据发音部位提前动作,双唇音必须对准发声帧。Lazare:只有整句播放都偏晚时,才将所有嘴部关键帧提前 1 到 2 帧。
- 润色要分清轻重缓急;审核要从上到下。 Elver 会对反馈排序,把精力投入回报最高的部分,并确保每一帧接触动作都到位。Newman 按意图、力学、表演、整合四项进行评估;playblast 无法证明游戏手感。
首先确定
| 输入 | 为何会影响计划 | 简报未说明时的默认值 |
|---|---|---|
| 风格和用途 | 夸张幅度、停顿、与参考的贴合程度:卡通风格需要夸张推演;真人动画需要姿势夸张且不能出现死板停顿(Elver);VFX 应贴近参考(Neistadt) | 真实感的影视级品质 |
| 帧率 | 时间数值、currentUnit | 24 fps(film) |
| 重量和力度 | 抵抗的帧数和克服阻力的帧数(Wade:先确定这两个数值) | 重物:抵抗动作至少 2 帧,不悬停 |
| 绑定 | 控制器名称、IK/FK、空间、脚部滚动属性(使用 listAttr(keyable=True) 一次性映射) | 手部使用 IK,镜头内不切换 IK/FK 或空间(Newman) |
| 摄像机 | 锁定的镜头摄像机是唯一评判标准;游戏项目还需考虑所有角度和引擎 | 搭建镜头摄像机并锁定 |
| 参考和音频 | 关键节点(接触、起跳、最高点、落地、眨眼、快速转向)提供节奏,然后再加强表现(Neistadt) | 根据简报列出节拍清单 |
| 游戏指标 | 动画前先用整数商定速度和高度(Newman);原地动画还是根运动(Epic) | 原地动画,要求提供指标表 |
工作流
- 用数字规划。 按节拍列出帧数、每个节拍的主导部分、关键类别、接触点、窗口(蹲伏、推、腾空、冲击)和风格;
A.store_plan(plan)。实体镜头:A.air_frames(rise, drop)用于分配腾空时长。对白:包含潜台词和动作动词的短句,辅以受控音素(M、B、P、F、V、L、T、D),设置 2 到 4 个支点(Santos、Wade)。关卡:帧数总和正确。 - 设置。 设置 fps、范围、声音,并锁定镜头摄像机;查询切线默认值(2027 notes)。关卡:
mx_validate.validate(profile="shot", rules={"fps": 24})无失败项。 - 代理动画阶段(幅度大、速度快或受镜头约束的动作)。 使用
A.proxy_boxes(),设置关键位移和平倾;腾空部分使用A.ballistic_keys(),旋转比位移延后 1 到 2 帧(Camporota)。第一次预备动作通常幅度过大:A.scale_curve(root, "translateY", 0.8, rest_y, time=crouch)。关卡:对代理运行A.evaluate_gates()(ballistic、catch、resistance、push_fastest);查看proxy_curves.png。 - 阶梯式 Blocking。 使用
A.set_key_defaults("blocking");A.key_pose(pose, f, fill=ctrls)会为每个姿势中的每个控制器设置关键帧;分阶段处理:主要姿势、预备动作、过冲、分解动作(倾向相邻姿势,不要五五开)、停顿(A.key_hold());A.share_keys(ctrls)。切勿从中性绑定姿势开始表演(Neistadt)。蹲伏姿势:为脚部滚动设置关键帧,脊柱拖后,双臂自然下垂(Camporota)。关卡:每种关键帧类别都已包含;检查阶梯式 playblast(GUI)或tracks.png;写下画面传达的故事,然后检查剪影。 - Spline 阶段 1,核心。
snap = A.snapshot(ctrls)(缓冲曲线);只对 COG、脊柱和腿使用A.to_spline();脸部、眼睛、手指保持阶梯式(Camporota、Santos)。腾空运动要符合重力;硬着陆时使用断开的切线(Newman);落地脚掌保持平贴。动作发软时:A.restore(snap),增加姿势。之后每次添加关键帧:使用A.insert_key(),然后对采样快照运行A.curve_diff();在两个线段之外的差异可以接受(P4)。关卡:A.run_gates(plan)中的 ballistic、hang、catch、slide、penetration、foot_roll、spine_drag、heel_to_flat 均通过;停顿期间没有A.overshoots()。 - Spline 阶段 2,重叠。 先共同编辑相互关联的手臂、头部和次要动作(Newman),然后沿动作链使用
A.offset_keys()延后 1 到 2 帧。关卡:overlap滞后值不全为零;pose_to_pose_tell较低;镜头中的轨迹干净。 - 面部,有面部镜头时适用。 先做身体,再做面具(眼睛、眉毛),最后做嘴部:在
A.mouth_keys(phonemes)设置木偶式下颌关键帧,处理五个主要音素、舌头,并使用A.copy_curve()建立连接(鼻孔比嘴角延后 1 帧,并减弱动作)。眼睛使用线性曲线,快速扫视用 2 帧;眨眼时闭眼快于睁眼。关卡:检查A.jaw_report()、相对于A.audio_envelope()的A.lip_lag()、A.blink_report()、A.transitions();特写镜头需覆盖支点。 - 润色,按优先级处理。 每次处理一个部分,修复排名最高的问题。接触点和快速动作使用逐帧关键帧;每次起跳都要有剥离动作;冲击要有明显的挤压和更长的停顿;突然弹出动作改为沿弧线运动 3 帧并加上过冲;使用
A.retime()收紧某个部分;加入移动停顿;最终版本前渲染带运动模糊的画面(均参照 Elver)。关卡:所有关卡均通过(包括 peel_off、impact_hold),图层已合并,没有子帧,Euler 已过滤,并为最终 playblast 编写 critique.md。
变体。 循环:每 3 帧一个姿势,在润色前使用 A.cycle() 循环;循环内的偏移要保持周期不变。游戏片段:处理指标、A.cycle_speed()、循环接缝、根节点规则,然后执行 scenario-maya-pipeline-scripting。动作捕捉:规程 P12;重定向:P13;复杂交互:P9。
数值
| 值 | 适用范围 | 来源 |
|---|---|---|
| 重力 1.703 cm/frame^2 (981/576) | 24 fps,场景单位为 cm | physics [已添加] |
| 每隔 3 帧设置一个走路关键帧:接触 1、下沉 4、经过 7、抬起 10、接触 13;循环范围为 1 到 25 | 24 帧循环 | Camporota |
| 脚触地到脚掌放平约 1 帧,最多 2 帧;走路时手臂偏移 0、1、2,头部偏移 1 | 每一步和着地时 | Camporota;body digest |
| 旋转比平移落后 1 到 2 帧 | 代理体和身体 | Camporota |
| 快速动作每帧设置关键帧;慢速动作的关键帧间隔 2 到 4 帧 | 阻挡动画 | Newman |
| 闭眼 2 帧 / 睁眼 4 帧(或 3 / 5;大眼睛多 1 帧) | 帧数 | Elver |
| 眼球快速转动 2 帧,线性;眉毛领先眼睑 1 到 2 帧,绝不超过 5 帧 | 帧数 | Elver |
| 干脆利落的动作:沿弧线运动 3 帧,再稍微过冲,绝不只用 1 帧 | 帧数 | Elver |
| 整体唇形偏移提前 1 到 2 帧;第 1 帧时嘴部接近完全张开 | 速度较快时延迟的情况 | Lazare |
| 五个主要口形占口型同步的 90%;下颌加嘴角占 50% 到 60% | 控制项 | Santos、Elver |
| 游戏速度:走路 2、跑步 4 到 6、冲刺 12 到 15 m/s | 风格化玩家 | Newman |
Playblast 默认缩放比例为 0.5:传入 percent=100 | 活动视图 | Maya 2027 Help |
质量门槛
可测量(A.run_gates(plan);纯逻辑函数 A.evaluate_gates),适用于计划中的任何跳跃、单脚跳、着地或重心转移: fps;重物腾空阶段 g_ratio 为 0.8 到 1.25,滞空超出部分最多 1 帧,水平速度恒定;接住重物(2 帧内消除 60% 以上的下落速度,减速时间短于恢复时间),随后在最低点保持 3 帧以上;蹬地时速度最快;重物阻力节拍静止 3 帧以上;每次下蹲:脚部滚动,脊柱落后于髋部;触地后 2 帧内脚掌放平;离地时脚尖与起跳点的角度在 30 度以内;脚着地时移动速度最多 0.2 cm/frame,穿透深度小于 0.5 cm;着地前拉伸;冲击之外不得出现跳变;重叠动作有延迟;移动结束时保持姿势;样条化后预备动作不到 90%;不得有子帧;润色阶段不得有动画层。[已添加] 阈值为工具包默认值。视觉检查: A.review_images(plan, out)(无头模式:curves.png 显示堆叠曲线通道,tracks.png 显示相机空间轨迹和洋葱皮姿势);在 GUI 中使用 A.playblast_pack()(镜头摄像机加无灯光剪影)以及逐帧预览 playblast。按时间顺序读取帧;先写下首次观看时的观感,再记录数值(critique.md)。
常见错误
| 错误 | 表现 | 修正方法 |
|---|---|---|
| 姿势还没定好就开始样条插值 | 动作模糊,手臂穿过身体摆动 | A.restore(snap),以阶梯方式添加过渡姿势 |
| 间距均匀,整个身体都在同一批帧上摆姿势 | 动作轻飘,像是在“摆姿势” | 让动作偏向相邻姿势,加入停顿,沿动作链使用 offset_keys |
| 保留第一轮的预备动作 | 下蹲动作抢了主体动作的风头 | 围绕静止值使用 A.scale_curve(..., time=crouch) 缩放曲线 |
| 躯干与臀部锁定,手臂在下蹲时向后摆 | 僵硬、套路化的预备动作 | 脊柱动作滞后于臀部,只有手臂下垂 |
| 下蹲时脚掌平贴地面,起跳时脚尖朝前,落地时脚掌放平太慢 | 压缩感弱、没有蹬地感,脚掌拍地 | 脚部滚动;脚尖朝向起跳位置后方;在 1 到 2 帧内放平 |
| 沉重身体做出风格化滞空 | 动作顶点轻飘 | ballistic_keys,顶点保持平坦,接触切线断开 |
| 发力前没有阻力 | 像泡沫塑料一样轻 | 推蹬前加入 2 帧或更多的吃力动作 |
| 下沉对称,或刚压缩完就直接弹起 | 落地轻飘 | 突然承接,更长的停顿,一次过冲,缓慢恢复 |
在样条曲线上使用 S 或裸写的 setKeyframe | 相邻关键帧形状改变,停顿漂移 | 使用 A.insert_key,然后使用 A.curve_diff |
| 样条曲线穿过停顿 | 停顿漂移 | 使用 key_hold 支柱,保持两侧平坦或呈平台状 |
| 在 3D 轨迹上检查弧线 | 轨迹平滑,但屏幕上的弧线断裂 | 使用 camera_track 像素轨迹 |
| 在声音发出时设定口型同步关键帧 | 实际播放时滞后 | 按声音分别提前,然后整体平移 |
交接
接收内容来自 scenario-maya-rigging 和 scenario-maya-deformation:已引用(绝不导入)的绑定,validate(profile="rig") 检查通过,包含 IK/FK、空间和脚部滚动属性的控制器列表,以及动作范围播放预览。绑定问题(膝盖弹跳、空间翻转)应附上帧号备注并退回。交付内容发送给 scenario-maya-lighting-rendering:新保存的版本,validate(profile="shot") 检查通过,图层已合并,辅助对象已删除(A.delete_helpers()),run_gates JSON 中无失败项,Agent 查看过的最终播放预览,以及尚未验证的内容。游戏片段发送给 scenario-maya-pipeline-scripting:按片段烘焙的骨架、片段名称和范围(书签)、根节点规则(原地或根运动)、循环接缝和速度报告。
Maya 2027 说明
- 默认切线:一个文档页面上是 Auto Span (Legacy),另一个页面上是 Clamped:查询
keyTangent(q=True, g=True, itt=True)。Lock/Free Tangent Weight 现称为 Tangent Length; Butterworth 现称为 Smooth Filter (Butterworth)。 - Time Slider > Enable Stepped Preview;
A.stepped_preview()是脚本对应功能。自 2025.1 起,Dope Sheet Time Snap 默认为关闭,且scaleKey会保留子帧:A.snap_subframes()。 - Ghost Editor 和 Motion Trail Editor 位于 Visualize 下;要为蒙皮网格启用鬼影效果,需要开启 Cached Playback(运动模糊、Trax、经典动力学会将其禁用)。
- Playblast 需要模型面板(通过 mx_bridge 使用 GUI);在 mayapy 中使用
review_images或 Arnold 静帧。 - Sequencer(前身为 Camera Sequencer):锁定每台摄像机。HumanIK 必须在其自身窗口中烘焙,而非使用 Bake Simulation。Time Editor 剪辑不能与动画层混用。Blue Pencil 取代了 Grease Pencil。
参考资料
references/expert-notes.md:各专家的原则与数值、时间戳、决策条件。加载以选择方案或撰写说明。references/procedures.md:mx_animAPI 和完整流程,附测试路径。编写代码前加载。references/critique.md:审查标准(初次查看、四个类别)、导演术语、备注格式。每个检查关卡都要加载。references/gui-paths.md:菜单、快捷键、编辑器设置。供计算机操作 Agent 或人工使用时加载。references/sources.md:所有来源、凭证、URL 和最佳时间戳。