关于 blender-facial-shapekeys
面向 Blender 创作者的面部绑定与形态键工作指南,涵盖 ARKit、viseme、修正形态和导出注意事项,适用于多种面部动画流程。
主要功能
- 01创建 ARKit 52 和 Oculus viseme 键
- 02拆分与镜像形态键
- 03检查未完成形态键
- 04可选控制器属性与驱动器
- 05制作修正形态和组合形态
- 06提供引擎导出说明
适用场景
- 01为游戏或 VTuber 制作面部表情
- 02为动作捕捉流程制作 blendshape
- 03在 Blender 中构建电影风格面部绑定
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ blender-skills --skill blender-facial-shapekeys安装后在 Claude Code 中输入/blender-facial-shapekeys确认已加载。
附带文件scripts/_bpyx.pyscripts/shapekeys.py
详细介绍
面部绑定与形状键
执行模型位于 blender-core。身体绑定位于 blender-character-rigging。
选择方案
| 方案 | 用途 | 备注 |
|---|---|---|
| Blendshapes(ARKit 52) | 游戏、VTuber、动作捕捉(iPhone / Live Link Face)、Web / VRM | 行业通用的交换集;每个形状都需要雕刻 |
| 骨骼(下颌、眼睛、眼睑、眉毛、嘴唇) | 风格化作品、低内存占用、移动端 | 下颌和眼睛几乎总是适合用骨骼控制 |
| 混合方案 | 大多数商业游戏头部 | 下颌 / 眼睛 / 舌头使用骨骼,其余柔性部位使用形状键 |
Rigify 面部绑定(human 元骨架) | 在 Blender 内进行电影风格的关键帧动画 | 100 多根面部骨骼,对引擎而言负担较重 |
操作步骤(blendshape)
- 头部网格需要在眼睛和嘴部周围布置整齐的边线(
blender-retopology-uv);眼睛、牙齿和舌头应作为独立对象,父级绑定或权重绑定到骨骼。 scripts/shapekeys.py -- --mesh Head --create arkit(或使用--create visemes创建 15 个 Oculus 视素)会创建空的、命名正确的键。- 雕刻每个键(实时操作:在活动键上使用雕刻模式,
use_shape_key_edit_mode)。对称表情可以只雕刻一次,然后用--split eyeBlink生成eyeBlinkLeft/Right,并在 X=0 处进行柔和混合(--falloffm)。 --mirror browDownLeft会生成browDownRight(不依赖拓扑的镜像)。--report会列出尚未雕刻的键、每个键的最大偏移量,以及缺少的 ARKit 名称。只有在每个键都产生变化且没有遗漏时,形状才算完成。- 可选:
--drivers FaceCtrl会添加一个控制器,其中的 0–1 自定义属性可驱动每个键,供 Blender 中的关键帧动画使用。 - 使用
look检查极限状态和组合(jawOpen + mouthSmile、eyeBlink + eyeSquint)。发现问题时,用由两个键值乘积驱动的组合修正键进行调整。
形状键规则
- 形状是相对于 Basis 的差值。创建键后,切勿更改 Basis 的拓扑(添加或删除顶点会破坏所有键)。
- 每个键只负责一个动作。面部键中不要包含头部或颈部运动(这些由骨骼控制)。眼睑应沿眼球表面滑动,而不是穿过眼球(使用
blender-asset-qa检查眼睑 / 眼球上的 z-fighting)。 - 范围为 0–1。可以提高
slider_max来增强效果,但引擎会将数值限制在 0–1。 - 只有相对键(
use_relative=True,默认值)可以导出。 - 名称必须严格符合规范(区分大小写):
eyeBlinkLeft,而不是EyeBlink_L。引擎会根据名称进行映射。 - 对带有 Subdivision 的网格使用形状键时,应在 0 级细分下雕刻,并将细分修改器放在形状键之后(无论如何,形状键都会先计算)。
- 对带有形状键的网格应用修改器会失败。对变形修改器使用
modifier_apply_as_shapekey,或在创建形状键前应用修改器。
修正形状与组合形状
- 骨骼姿势的修正形状:在摆好姿势的状态下雕刻,然后使用
TRANSFORMS变量驱动(ROT_X、LOCAL_SPACE,映射到 0–1)。 - 组合形状:创建键
jawOpen_mouthSmile,并用SCRIPTED驱动表达式a*b,取值来自两个键(SINGLE_PROPkey_blocks["jawOpen"].value)。简单表达式不需要启用 Python 自动运行。
引擎说明
- Unity:使用 FBX blendshape。在 Model 导入器中,将 Blend Shape Normals 设为 Calculate(若导出时已包含平滑信息,也可设为 Import)。ARKit 名称会映射到 AR Foundation 的面部追踪示例。
- Unreal:使用形态目标("Import Morph Targets")。Live Link Face / MetaHuman Animator 使用 ARKit 名称,Pose Asset 会映射这些曲线。不要添加叶骨骼。
- Roblox 动态头部:使用基于 FACS 的姿势和 Roblox 专用名称,并将其制作成头部绑定上的动画帧(Creator Hub "Dynamic heads" 规范)。使用官方 Blender 模板制作。ARKit 雕刻可通过重命名 / 映射重复利用。头部不得超过 4,000 个三角面。
- VRM / Web(three-vrm、ReadyPlayerMe 风格):将 ARKit 52 + 视素作为 glTF 形态目标导出(
export_morph=True)。仅在着色需要时启用形态法线导出(会使体积翻倍)。 - 导出前删除未使用的键。每个键都会按顶点占用内存(glTF 稀疏访问器有助于节省空间)。
注意事项
ob.shape_key_add(from_mix=False)会复制 Basis。from_mix=True会烘焙当前混合结果(适用于组合效果,但意外使用会很危险)。shape_key_mirror(use_topology=False)要求网格在 X 轴上对称。在活动形态键上运行(脚本会处理这一点)。- 形态键的驱动器变量使用 Key ID(
ob.data.shape_keys),而不是网格:fc = kb.driver_add("value")。
评论
支持 Markdown