关于 scenario-blender-animation
面向动画师和 Agent 的 Blender 动画技能,涵盖阶梯式阻挡、后期身体曲线化,并通过播放预览和测量检查动作。
主要功能
- 01阶梯式关键姿势阻挡
- 02仅身体曲线化流程
- 03逐帧动作测量
- 04洋葱皮与曲线图像
- 05播放预览和质量检查
适用场景
- 01规划角色表演节拍
- 02检查运动弧线和脚部接触
- 03制作单个弹跳物体动画
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-blender-animation安装后在 Claude Code 中输入/scenario-blender-animation确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdprocedures.mdsources.mdscripts/bx_anim.py详细介绍
Blender 动画(角色和物体)
专业动画意味着屏幕上的每一帧都是一种选择:观众能读懂的关键姿势、手工安排的停顿和突变、精心设计的间距,以及经过检查的弧线。Blender Studio 的做法是先用阶梯插值阻挡动作,后期再分阶段切换到样条插值,并从镜头摄像机视角按实际速度评判。Agent 无法拖动时间轴,因此要改为测量:逐帧位置、间距图表、弧线检查、构图、洋葱皮图像、曲线图,以及实际查看过的播放预览。如果这里提到的某个同类技能不在你的可用技能中,请让用户安装(npx skills add scenario-labs/skills --skill <name>);若无人值守,则根据工具架构继续操作,并标明缺失之处。
必备背景: scenario-blender-expert(执行通道、审查循环、5.2 API 变更)。镜头规划、摄影机和动态分镜属于 scenario-blender-previs-storyboard;绑定制作属于 scenario-blender-rigging。用于引导视频模型将渲染画面转换为实拍画面的片段属于 scenario-blender-blockout:模型会照原样复制已设关键帧的肢体,因此演员往往会给它一个没有肢体的替身,让它来制作步态动画。
工具包:scripts/bx_anim.py(设定关键帧、从阻挡动作转换为样条插值、曲线检查、测量、场面调度、轻量播放预览、膝部弹跳、翻转和平衡检查、洋葱皮和曲线图像、单物体 bouncing_ball;API 见 procedures.md,已在 5.2.1 上测试)以及 bx_review.playblast。
做法(专家级差异)
- 长时间保持阶梯插值(“Blocking+”)。 Hjalti Hjalmarsson:初级动画师太早切换到样条插值;计算机生成的中间帧是“无意插入的姿势”,会让修改意见难以落实。继续在阶梯插值状态下添加手工制作的过渡姿势;切换到样条插值应简短且靠后。
- 绝不要将整个阻挡动作转换为 Bezier。 Rik Schutte:每个关键姿势都为每个主要控制器设定关键帧,将每个姿势复制到其停顿结束处(“支柱”),然后只对身体切换到样条插值;面部和手指保持阶梯插值,直到各自的制作阶段。根据 5.2.1 的测量结果,直接转换会让下一动作的 84% 漂移到停顿段中;使用支柱则能精确保持不动。
- 突变要手工制作。 Rik:先停顿,再用 2 到 3 帧改变姿势;只有幅度大的刻意动作才留给插值。[新增,已测量] 连续运动中的接触(例如跳跃落地)不是停顿:用支柱处理会将身体在冲击瞬间的速度从每帧 0.101 米降至 0.007 米,导致落地显得轻飘。
- 关键姿势放在奇数帧,间隔保持偶数;过渡姿势塑造弧线并引导视线。 Alex Nagy:将关键姿势设在奇数帧,并保持间隔为偶数,这样才有真正的中间帧。过渡姿势应先确定弧线,再确定时序;如果它偏后,最后几帧就要走得更远,而最快的部分会吸引视线。
- 控制柄类型是时序决策。 AUTO_CLAMPED 会让停顿保持平直;AUTO 会在两个相同关键值之间产生超调(Alex 用它来强化姿势或缓冲收尾);VECTOR 适用于强烈撞击、接触和起跳(Alex、Dillon Gu);FREE 适用于爆发式间距和精确弧线(Raymond Luc、Joey Carlino)。
- 先由一个部位带动,再逐层叠加其他部位。 Rik 会先制作仅由躯干构成的节奏段;Dillon 会用重心带动身体力学,用头部或眼睛带动表演。重叠动作应放进阻挡动作中,头部转动绝不能只绕一个轴进行(Rik)。
- 口型同步要先把握节奏,再塑造形状。 Rik:先制作下颌动作,保持阶梯插值,只在重音处大幅张口;不同步是因为缺少预备动作,而非整体偏移;发 M、B、P 音时至少闭嘴 2 帧,并且要在声音发出前闭嘴。
- 间距要有感觉,弧线要检查,镜头必须清晰易读。 Raymond:观众应感受到间距变化,而不是看见刻意操控。Pablo Fournier:弧线是最重要的检查项(根部、手、脚、鼻子),并且要在摄像机空间中检查。Hjalti(见 scenario-blender-previs-storyboard):每次切镜后,观众的视线都必须能找到一个关注点;因此,主体若消失在空旷画面中,无论曲线做得多好都不合格。
首先确定
| 输入 | 为什么会改变计划 | 未说明时的默认值 |
|---|---|---|
| 媒介、帧率 | 电影为 24(Hjalti);游戏通常为 30,并使用固定的命中或释放帧(Picaut) | 24 fps |
| 摄像机 | 固定表演镜头:只通过摄像机判断(Rik)。移动、可重新取景或游戏摄像机:姿势从各个方向看都应成立(Leo Silly-Pelissier、Picaut) | 固定摄像机 |
| 风格 | 双帧动画,且绝不使用样条曲线(Sprite Fright 镜头、Rik)与样条曲线动画;风格化与写实(Leo) | 样条曲线动画、风格化 |
| 骨架 | 控制器名称、IK/FK、旋转模式。生成的 Rigify [verified]:torso、hips、chest、head、foot_ik.L、upper_arm_fk.L、jaw_master;upper_arm_parent.L 上的 ["IK_FK"](0 为 IK,1 为 FK);腿部的 IK_Stretch 为 1.0;静止姿势下腿部有 99.6% 笔直;主要控制器为 QUATERNION | 需要运动弧线时手臂用 FK,手接触物体时用 IK(Joey、Tony Garcia) |
| 命名对象 | 如果简报指定了动画对象,就需要为该对象设置所有通道 | 一个对象,bouncing_ball(obj=...) |
| 音频、转录文本 | 节拍、重音、音素准备 | 根据简报确定节拍 |
| 参考资料 | 用于确定时机和节拍,绝不可照描(Hjalti) | 无:编写节拍列表 |
| 预算 | Rik:大型工作室约每周 3 秒,个人表演镜头约 5 到 6 秒;Flow:每位动画师每天 2 秒 | 说明预算能完成什么 |
工作流
- 规划。 编写带帧数的节拍列表:按顺序列出每个表演节拍(Hjalti 每个镜头约有 8 个),
子节拍:注意、反应、意识到、回应(Rik),以及每个节拍的主导部分。有音频时,使用
audio_envelope+accent_frames;在音频峰值之前打出姿势(Alex)。从动作中段开始(Rik)。GATE:节拍表已写好。 - 设置并布置镜头(P1,P18):fps、范围、声音、passepartout 0.99,预览时启用 Simplify。先放置摄像机,再使用实际渲染尺寸运行
staging_report(subject, frames): 主体高度、动作占据画面的比例、入场位置、最终姿势的边距。Playblast 外观:playblast_lighting(key_dir=(0, 0, 1))(顶光会转换到 Workbench 的摄像机空间:阴影位于主体下方,间隙等于主体高度,接触点是两者相遇之处),floor_slab,在所有会滚动的物体上使用rotation_texture。GATE:flags为空;shadow_frames显示物体在空中时的阴影,并在接触时与物体相接;已查看摄像机静帧。 - A 阶段 Blocking,关键姿势采用阶梯插值。 先制作最有力、保持时间最长的姿势(Alex)。逐个构建每个姿势的 COG、双脚(重心位于支撑脚上,双脚不能像双胞胎一样对称,膝盖放松)、髋部、胸部、头部、手臂。使用
world_pose以世界空间描述姿势(绑定的坐标轴并无固定规则),使用key_pose(..., keytype='EXTREME')制作关键帧,设为 CONSTANT,并为所有主要控制器制作关键帧。GATE:姿势条带onion_skin(frames=keys, spread=...)显示清晰的轮廓和对比;保持姿势时balance_report的边距 >= 0。 - 增强 Blocking(仍采用阶梯插值)。 在中间帧使用
breakdown,并按部位设置factors(COG 下沉,四肢延迟 0.2 到 0.3,晚期偏重有方向性的部位;离地后身体呈抛物线运动,7 帧中的 3 帧完成约 2/3 的上升,双脚必须跟随);使用ease_inbetweens设置 20/80(Pablo);添加过冲和缓动到位;错开重叠动作;将关键帧类型用作信心映射(Hjalti)。GATE:阶梯插值 playblast 已获批准;关于意图的备注已停止(Leo:Block B 之后不再有备注)。 - 对身体应用样条插值,使用
blocking_to_spline(rig, body_bones, transition=3, interpolate={...}): 将大幅动作和持续接触设为interpolate。脚部接触和离地使用 VECTOR。GATE:hold_drift< 1e-5,overshoots中只有预期的缓动到位,面部仍为 CONSTANT,motion_report中没有意外的等间距运动;空中 COG 的ballistic_fit中,g_ratio接近 1.0,残差较小;limb_extension从不高于 1.0。 - 重新注入能量(Leo:样条插值会使动作变柔):强化节奏点、过冲和不同步的部位;使用
offset_keys让每段链条错开 1 到 2 帧(Dillon);循环动作中头部滞后 2 到 3 帧(Joey);接触时允许滑动,不要像粘住一样(Rik)。手指:少量重叠,不要反弹。GATE:在摄像机像素中运动轨迹流畅(to_camera(..., res=(w, h))、motion_report(dims=2))。 - 面部和口型同步,采用阶梯插值(P6,P7):下颌节奏、嘴角(绝不放在正中)、使用下半脸(不包括下颌)的姿势库形状,少量添加重音和不对称,最后处理舌头,然后对面部应用样条插值。眼睛在 1 到 2 帧内快速移动,并先于头部动作;眉毛提前 3 到 10 帧(Rik)。引擎或捕捉应用按名称读取的关键帧(ARKit、visemes):设置关键帧前,先检查 scenario-blender-rigging 的
shape_report。GATE:transitions符合这些计数;重音数量明显少于音节数量。 - 润色。
foot_slip小于 1 mm,使用lowest_point检查穿透,rotation_flips为空(fix_rotation_flips);腿部应保持弯曲的地方,limb_extension小于 0.99;涂抹帧为 1 帧(Pablo);仅在此阶段调整爆发式动作的间距(Raymond);启用细分。GATE:最终 playblast、洋葱皮和曲线图均通过 critique.md 评估标准。 变体。 弹跳球(P16、P18):bouncing_ball(obj=ANIM_ball, first_apex=-3, fit=False, ...)为一个对象设置关键帧:在全程重力作用下,通过整帧接触点形成精确抛物线;可以是奇数或偶数次弹跳,让小幅跳跃保持原有高度;在接触帧压扁,并通过世界对齐的挤压修改器沿速度方向拉伸(旋转永远不会扭转);滚动 = 距离 / 半径;滚动速度恒定减速;保持 6 帧。first_apex在start之前时,会让物体从画外飞入。权重映射为 [添加]:通过渲染进行调校。 行走(Joey,30 fps):接触 0、下沉 5、经过 10、上升 15,40 帧一个循环;接触期间脚跟曲线保持直线,根运动采用 REPEAT_OFFSET(P5)。跳跃:tests/code/blender-animation/test_rigify_jump.py是完整示例(Rigify 人体,从阻挡动画到样条动画)。
数值
| 项目 | 数值 | 来源 |
|---|---|---|
| 利落的姿势变化 | 保持后 2 到 3 帧 | Rik |
| 激烈的变化 | 8 帧改为 4 帧 | Alex |
| 让观众理解一个想法的保持时间 | 6 帧 | Alex |
| 稳定下来 | 1 到 2 帧,轻柔时为 4 帧 | Alex |
| 刺激后的反应 | 约 6 帧 | Rik |
| 眼球快速转动 / 眉毛变化 | 1 到 2 / 3 到 10 帧 | Rik |
| 缓动规则 | 每个中间帧走完剩余路程的 80%(缓入);反向则为 20% | Pablo |
| 残影 | 1 帧,有时 2 帧 | Pablo |
| 微预备动作 | 击中或释放前最后 1 到 2 帧推至极限 | Picaut |
| 循环中的头部滞后 / 脚部偏移 | 2 到 3 帧 / 1 帧 | Joey / Rik |
| 24 fps 下的真实重力 | 加速度为 0.01703 m/frame^2;二次拟合的首项系数为其一半(-0.00852)。gravity() | physics [添加] |
| 主体在画面中的大小 | 至少占画面高度的 12%;单个主体占 15% 或更多 | [添加] E3:两次运行测得均为 10% |
| IK 腿部伸展 | 需要保持弯曲时低于全长的 0.99;高于 1.0 = IK 拉伸 | [添加] |
| 滚动物体上的风车效应 | 每帧滚动角度小于 360 / 扇区数 | [添加] 马车车轮效应 |
质量门槛
可量化: 槽位以角色命名;关键姿势在批准前设为 CONSTANT 并指定类型;
hold_drift 约为 0;overshoots 仅出现在缓入定格时;foot_slip < 1 mm;lowest_point 绝不会低于地面(采样子帧);飞快动作、眉毛动作、快速动作和爆破音都要设置 transitions;实际比例下 ballistic_fit 的 g_ratio 接近 1;motion_report:急转只出现在接触时,一个动作内部没有弧线抖动或突然起停;
staging_report 标记为空,且阴影帧可见;limb_extension、
rotation_flips、balance_report 如上;roll_aliasing 正常。视觉检查(打开每张图):姿势条、通过镜头摄像机查看整个镜头的洋葱皮并显示轨迹、graph_image、播放预览帧表(主体大小、入场、接触时阴影间隙闭合、旋转清晰可读);摄像机未锁定时查看轨道视图。
常见错误
| 错误 | 表现 | 修复 |
|---|---|---|
| 整段阻挡都转为 Bezier | “漂浮的意大利面” | 使用 blocking_to_spline 配合支柱,仅处理身体 |
| 在连续接触处设置支柱 | 身体在撞击前减速 | 将该帧放入 interpolate;脚部使用 VECTOR |
| 定格时使用 AUTO 控制柄 | 定格姿势后仍持续漂移 | 使用 AUTO_CLAMPED;仅在缓入定格时使用 AUTO |
| 接触时脚跟曲线缓入缓出 | 脚滑动(测得每步 5.8 cm) | 使用 VECTOR 或零长度 FREE 控制柄 |
| 每个音节都张嘴 | 嘴巴喋喋不休 | 仅在 accent_frames 上大幅张嘴 |
| 球使用 BOUNCE 缓动 | 从未出现挤压帧 | 使用 bouncing_ball 或按整帧设置接触关键帧 |
| 在也用于瞄准的父级上进行挤压 | 拉伸帧上的图案发生扭曲(旧绑定测得 55 度) | 在物体本身上使用 squash_modifier(世界坐标轴) |
| 将腾空帧数取整为偶数 | 跳跃高度增减,每次弹跳的重力都会变化(测得从 0.98 到 1.31) | 接触帧使用整帧,允许腾空帧数为奇数,重力保持不变 |
| 将整个场景纳入取景 | 主体占画面 10%,顶部 40% 为空 | 拉近镜头或缩短移动距离,直到 staging_report 无异常 |
将 display.light_direction 视为世界坐标 | 阴影藏在主体后方(0 px) | 使用 playblast_lighting(key_dir=...) |
| 在归一化摄像机坐标中检查弧线 | 顶点处出现假的急转(宽高比压缩了 x 轴) | 使用 to_camera(..., res=(w, h)) |
| 站立或蹬离时双腿伸直 | IK 拉伸会延长腿部(第一版跳跃草稿中增长了 18%) | 膝盖保持微屈,起跳后再做脚部分解,起跳使用 VECTOR |
Blender 5.2 说明
action.fcurves已移除:需通过bpy_extras.anim_utils使用 channelbags(bx_anim.channelbag)。 只有槽匹配时,分配 Action 才会产生动画;否则需设置ad.action_slot。- 每个 Action 只能有一个层(
layers.new会报错);使用包含 NLA 的层和 ADD 或 COMBINE Action (push_layer)。 keyframe_points.insert会生成 BEZIER AUTO_CLAMPED;曲线上的下一次插入会使 Keyframe 引用失效。- 无头模式:
anim.keyframe_insert会失败;pose.breakdown和pose.blend_to_neighbor需要 明确指定prev_frame/next_frame;render.opengl不可用,因此预览动画使用 Workbench 渲染。 - Workbench 的
scene.display.light_direction是相对于摄像机的;在调用view_layer.update()之前,matrix_world会过时,因此需在更新后转换。 - GN 修改器输入的键位于
modifiers["X"].properties.inputs.Socket_n.value。 - 预览动画音频:添加声音条带,并设置
render.ffmpeg.audio_codec = 'AAC'。 - 键位映射:Up = 上一个关键帧,Down = 下一个关键帧(5.0)。5.2 中没有:Action 层、粘贴姿势混合、 范围世界空间复制(5.3)。
参考资料
references/expert-notes.md:专家的原则、数值和不同意见, 附有时间戳;在选择方案或撰写说明时加载。references/procedures.md:每个流程的完整测试代码 (设置、阻挡、样条、行走、口型同步、面部时间安排、接触固定、槽、层、姿势库、 预览动画、测量、球体、场景布置、膝盖/翻转/平衡);编写代码前加载。references/critique.md:各阶段的评审标准、场景布置 阈值及其校准方式,以及这些动画师撰写评语的方式;在每个关卡都加载。references/sources.md:14 个源视频、各自最适合的用途和 最佳时间戳。