用途
该技能用于在 Blender 5.2 中制作面部绑定与形态键(shape keys),面向游戏、VTuber、动作捕捉、网页/VRM 等场景。其执行模型在 blender-core,身体绑定部分在 blender-character-rigging。资料未提供具体价格、收费或授权信息。
方案选择
资料给出四种可选方案:
- 混合形状(ARKit 52):适用于游戏、VTuber、mocap(iPhone/Live Link Face)、网页/VRM;属于行业通用的交换集合,每个形状需单独雕刻。
- 骨骼(下颌、眼睛、眼睑、眉毛、嘴唇):适用于风格化、低内存、移动端;下颌与眼睛用骨骼几乎总是合适的。
- 混合(Hybrid):多数生产级游戏头部采用;下颌/眼睛/舌头用骨骼,所有柔性部分用混合形状。
- Rigify 面部(human metarig):用于 Blender 内电影风格的关键帧动画;有 100 多个面部骨骼,对引擎而言较重。
主要能力与使用方式(以混合形状为例)
- 头部网格需要眼周与口周干净布线(blender-retopology-uv),眼睛、牙齿、舌头作为独立对象,父子约束或权重绑定到骨骼。
- 通过
scripts/shapekeys.py -- --mesh Head --create arkit创建正确的空命名键;或用--create visemes创建 15 个 Oculus visemes。 - 逐键雕刻(在活动键上进入雕刻模式,use_shape_key_edit_mode)。对称表情可只雕刻一次,再用
--split eyeBlink得到 eyeBlinkLeft/Right,并在 X=0 处做柔和过渡(--falloff m)。 --mirror browDownLeft可生成 browDownRight(与拓扑无关的镜像)。--report列出未雕刻的键、每个键的最大偏移以及缺失的 ARKit 名称。只有每个键都有位移且无遗漏,形状才算完成。- 可选:
--drivers FaceCtrl添加带 0–1 自定义属性的控制器来驱动每个键,便于在 Blender 中打关键帧。 - 用 look 检查极值与组合(jawOpen + mouthSmile、eyeBlink + eyeSquint),并用由两个键乘积驱动的修正组合键来修复。
形态键规则
- 形状是相对于 Basis 的增量。创建键后绝不可更改 Basis 拓扑(增删顶点会破坏所有键)。
- 每个键一个动作。面部键中不要包含头或颈部移动(由骨骼负责)。眼睑需沿眼球表面滑动而非穿透(用 blender-asset-qa 的 zfighting 检查眼睑/眼睛)。
- 范围 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)驱动。
- 组合:用驱动 SCRIPTED 表达式 a*b 创建 jawOpen_mouthSmile,取自两个键值(SINGLE_PROP key_blocks["jawOpen"].value)。简单表达式不需要 Python 自动运行。
引擎注意事项
- Unity:FBX blendshapes。在 Model 导入器中设置 Blend Shape Normals = Calculate(若导出了平滑则用 Import)。ARKit 名称映射到 AR Foundation 面部跟踪示例。
- Unreal:morph targets(“Import Morph Targets”)。Live Link Face / MetaHuman Animator 使用 ARKit 名称,Pose Asset 映射曲线。无叶骨骼。
- Roblox 动态头部:基于 FACS 的姿态,使用 Roblox 特定名称,在头部绑定上以动画帧形式创作(Creator Hub “Dynamic heads” 规范)。从官方 Blender 模板构建。ARKit 雕刻可通过重命名/映射复用。头部 ≤ 4,000 三角面。
- VRM / 网页(three-vrm、ReadyPlayerMe 风格):ARKit 52 + visemes 作为 glTF morph targets(export_morph=True)。仅在着色需要时才保持 morph-normal 导出(会使体积翻倍)。
- 导出前删除未使用的键。每个键都按顶点消耗内存(glTF sparse accessors 有帮助)。
注意事项
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")。