图像与设计
在 Blender 中为物体、相机…
当需要在 Blender 中让任何属性随时间变化(移动、旋转、缩放、淡入淡出、脉冲、面部表情、口型同步等)时,用关键帧、F-curve、形态键、驱动器或 NLA 实现动画。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 Blender 中为物体、相机、灯光特定
解决思路
- 按运动类型选择方案:物体位移/旋转/缩放用 location/rotation_euler/scale 关键帧;机械匀速用 Linear 插值;自然运动用 Bezier 自动手柄;卡通风格用 Bounce/Elastic/Back 缓动;面部/形态用 Shape Keys 动画 value;属性间函数关系用 Drivers;可复用/分层动画用 NLA。
- 物体位移动画:设置 scene.frame_start/frame_end/render.fps,用 scene.frame_set() 定位帧,修改 obj.location 后调用 obj.keyframe_insert('location', frame=N) 插入关键帧(默认 Bezier 平滑)。
- 旋转动画:用 rotation_euler 单轴旋转,在 1、120、240 帧分别插入 0、math.radians(180)、math.radians(360) 关键帧;注意超过 180° 会翻转,需多关键帧或四元数。
- 设置 Linear 插值:用 get_fcurves_compat(action) 兼容函数(Blender 5.x 用 action.layers[].strips[].channelbags[].fcurves,旧版用 action.fcurves)遍历所有 fcurve,将每个 kp.interpolation 设为 'LINEAR';其他可选 'BEZIER'、'CONSTANT'、'SINE'、'QUAD'、'CUBIC'、'QUART'、'QUINT'、'BOUNCE'、'ELASTIC'、'BACK'。
- 卡通弹跳缓动:找到目标 fcurve(按 data_path 和 array_index 匹配),将最后一个关键帧的 interpolation 设为 'BOUNCE',easing 设为 'EASE_OUT'(可选 'AUTO'、'EASE_IN'、'EASE_OUT'、'EASE_IN_OUT')。
- 形态键(morph/blendshape/viseme):若 mesh_obj.data.shape_keys 为 None 则先 shape_key_add(name='Basis'),再 shape_key_add(name='Smile') 并设 value=0.0;在 Edit Mode 中修改网格以定义形态;然后对 smile.value 在不同帧调用 keyframe_insert('value', frame=N) 做动画。口型同步用标准 15 个 viseme(Oculus/ARKit),命名如 viseme_aa、viseme_E、viseme_O,按音频时间线动画各 viseme 的 value。
- 驱动器:用 target.driver_add('location', 0) 添加驱动器,设 driver.type='SCRIPTED',用 driver.variables.new() 创建变量(name、type='TRANSFORMS'、targets[0].id=源物体、transform_type='LOC_X'、transform_space='WORLD_SPACE'),最后设 driver.expression='src_x * 2'。
- NLA 复用:若 obj.animation_data.action 存在,用 obj.animation_data.nla_tracks.new() 创建轨道,track.strips.new('Walk', start=1, action=obj.animation_data.action) 创建 strip,然后将 obj.animation_data.action 设为 None 让 NLA 接管;之后可复制 strip、缩放时间、与其他轨道混合。
- 可循环 idle 动画:设置 frame_start=1、frame_end=96(24fps 下 4 秒),在 1、48、96 帧插入 rotation_euler 的微小摆动关键帧(如 Y 轴 -2°、2°、-2°),再用 get_fcurves_compat 遍历所有 fcurve 并调用 fc.modifiers.new('CYCLES') 设置循环外推。
- 遵循动画原则:慢入慢出(Bezier 自动实现)、预备动作(主动作前的小反向运动)、跟随动作(次要部位延迟停止)、挤压拉伸(用形态键或缩放夸张)、弧线运动(自然运动走曲线而非直线)。
- 常见问题修复:机械感太强说明用了 Linear(有机运动应用 Bezier);旋转在 180° 翻转需多关键帧或四元数;形态键改动丢失需退出 Edit Mode 提交;只动一个轴用 keyframe_insert('location', index=0/1/2);驱动器不更新需刷新视口并检查 Preferences → Editing → Allow Driver Python Expression;渲染 fps 不匹配需在动画前设置 scene.render.fps。
适用边界 · 注意事项
- 不涉及 Blender 的场景(如其他 3D 软件或纯代码动画)不适用。
- 需要精细 F-curve 手柄调整、NLA 分层混合、复杂多变量/条件驱动器表达式、ARKit 52 blendshape 全脸动画或走路/跑步/攻击循环时,应加载 references/overview.md 参考文档。
- Blender 5.x 中旧版 action.fcurves API 已移除,直接访问会失败,必须使用兼容函数。