Blender 教程: 为角色制作可动画的 2D 表情贴图

Blender 教程: 为角色制作可动画的 2D 表情贴图

在本教程中,我们将指导你如何在 Blender 中为一个 3D 角色头部模型制作一个可动画的 2D 表情系统。我们将使用一系列 PNG 图片作为不同的面部表情,并将它们投射到头部模型上。最终,你将能够通过控制一个简单的圆形对象来轻松切换角色的表情。

本教程适合对 Blender 有一定基础,并希望学习角色表情绑定和动画技巧的用户。

通过本教程,你将学到:

  • 如何在 Blender 中导入并使用“图像作为平面” (Images as Planes)。
  • 如何配置图像序列以实现动画效果。
  • 如何调整材质节点,使 2D 表情贴图不受光照影响并正确显示透明度。
  • 如何使用“收缩包裹” (Shrinkwrap) 修改器将平面贴合物体表面。
  • 如何使用驱动器 (Drivers) 将一个对象的属性链接到另一个对象的属性,以创建控制器。
  • 如何使用约束 (Constraints) 来限制控制器的运动范围。
  • 基本的动画关键帧设置。

准备工作

  • Blender: 教程中使用版本 4.4.0。
  • 一个头部 3D 模型: 你需要一个基础的头部模型用于投射表情。教程中已有一个名为 Head 的对象。
  • 表情图片序列: 一套 PNG 格式的图片,每张图片代表一种表情,并已处理好透明背景。文件名应按序列命名 (例如 001.png, 002.png, ..., 007.png)。教程中使用了7张表情图片。

步骤一: 导入并设置表情平面

  1. 在 Blender 的 3D 视图中,确保你的头部模型(教程中为 Head 对象)已准备好。
  2. 按下 Shift + A 打开添加菜单,选择 Image -> Images as Planes
  3. 在弹出的文件浏览器中,导航到你的表情图片序列所在的文件夹,选择第一张表情图片 (例如 001.png),然后点击右下角的 "Import Images as Planes" 按钮。
  4. 选中刚导入的平面。为了让它正对前方,我们需要旋转它:
    • 按下 R (旋转),然后按 X (沿X轴),输入 90,然后按 Enter。此时平面应该竖立起来。
  5. 将平面稍微向前移动,使其位于头部模型的前方,但不要穿透模型:
    • 按下 G (移动),然后按 Y (沿Y轴),向前拖动鼠标,或输入一个小的正值,然后点击确认。
  6. 切换到 正交前视图 (Front Orthographic View) (通常按数字键盘 1) 以便更好地观察。

步骤二: 设置渲染背景透明

为了在最终渲染时只看到角色和表情,而背景是透明的,我们需要调整渲染设置。

  1. 在右侧的属性面板中,找到 渲染属性 (Render Properties)(图标通常是一个小相机)。
  2. Render Engine 从默认的 Eevee更改为 Cycles
  3. 在其下方的 Device 选项中,选择 GPU Compute(如果你的电脑支持 GPU 计算,这会更快)。
  4. 向下滚动找到 Film(胶片)部分,展开它。
  5. 勾选 Transparent 复选框。现在,如果你切换到渲染预览模式(按 Z 键选择 Rendered),背景应该会变成棋盘格,表示透明。

步骤三: 配置图像序列着色器

现在我们需要告诉 Blender 我们使用的是一个图片序列,而不是单张图片。

  1. 保持表情平面被选中。
  2. 切换到 Blender 顶部的 Shading (着色)工作区。
  3. 在底部的着色器节点编辑器中,你会看到一个 Image Texture (图像纹理) 节点(当前显示的是你导入的第一张图片,如 001.png)连接到一个 Principled BSDF 节点。
  4. Image Texture 节点上:
    • 找到 Source (源) 属性,当前默认为 Single Image (单个图像)。点击它,从下拉菜单中选择 Image Sequence (图像序列)。
    • 点击节点上文件名旁边的小文件夹图标,重新打开文件浏览器。
    • A 全选文件夹中所有的表情图片 (001.png007.png),然后点击 "Open Image"
    • 现在,Image Texture 节点会显示序列的第一张图片,并且 Frames (帧数) 属性会更新为你图片序列的总数量(教程中是 7)。
    • 确保 Cyclic (循环) 和 Auto Refresh (自动刷新) 复选框都被勾选。

步骤四: 使表情材质不受光照影响且透明

为了让 2D 表情看起来像是卡通贴图,而不是受场景光照影响的 3D 物体,我们需要修改其材质。

  1. 调整光线可见性 (Ray Visibility):
    • 在右侧的属性面板中,找到 对象属性 (Object Properties)(图标是一个橙色方块)。
    • 向下滚动找到 Visibility (可见性) 部分,展开它。
    • Ray Visibility (光线可见性) 子部分中,取消勾选以下所有选项:Diffuse, Glossy, Transmission, Volume Scatter, 和 Shadow。这样做可以确保该平面不会接收或投射阴影,也不受复杂光照计算的影响。
  2. 修改着色器节点:现在,表情贴图应该是自发光的,并且其透明部分能够正确显示。
    • 回到 Shading 工作区的节点编辑器。
    • 选中并删除 (X 键) 默认的 Principled BSDF 着色器节点。
    • 按下 Shift + A 打开添加菜单,搜索并添加 Emission (自发光) 着色器节点。
    • 再次按下 Shift + A,搜索并添加 Transparent BSDF (透明 BSDF) 着色器节点。
    • 最后,按下 Shift + A,搜索并添加 Mix Shader (混合着色器) 节点。
    • 现在连接节点:
      1. Image Texture 节点的 Color 输出 (黄色圆点) 连接到 Emission 节点的 Color 输入。
      2. Emission 节点的 Emission 输出连接到 Mix Shader 节点的底部 Shader 输入。
      3. Transparent BSDF 节点的 BSDF 输出连接到 Mix Shader 节点的顶部 Shader 输入。
      4. Image Texture 节点的 Alpha 输出 (灰色圆点) 连接到 Mix Shader 节点的 Fac (系数) 输入。
      5. Mix Shader 节点的 Shader 输出连接到 Material Output (材质输出) 节点的 Surface (表面) 输入。

步骤五: 将表情平面贴合到头部模型

为了让 2D 表情能够随着 3D 头部的曲面变形,我们需要细分平面并使用“收缩包裹”修改器。

  1. 切换回 Blender 顶部的 Layout (布局) 工作区。
  2. 选中表情平面。
  3. Tab 键进入 编辑模式 (Edit Mode)
  4. 确保所有顶点都被选中 (如果没有,按 A 全选)。
  5. 右键点击,选择 Subdivide (细分)
  6. 在 3D 视图左下角弹出的 Subdivide 操作框中,将 Number of Cuts (切割次数) 多次增加,直到平面有足够多的细分以适应头部的曲面(增加到 10)。
  7. 再次右键点击并选择 Subdivide,这次将 Number of Cuts 设为 1 (或根据需要调整,以获得更平滑的细分)。
  8. Tab 键返回 物体模式 (Object Mode)
  9. 在右侧的属性面板中,选择 修改器属性 (Modifier Properties)(图标是一个扳手)。
  10. 点击 Add Modifier (添加修改器),在 Deform (形变)类别中找到并选择 Shrinkwrap (收缩包裹)
  11. Shrinkwrap 修改器设置中:
    • 点击 Target (目标) 旁边的吸管图标,然后在 3D 视图中点击你的头部模型(Head对象)。或者,直接从下拉列表中选择头部模型。
    • 调整 Offset (偏移) 值,例如设置为 0.01m。这个值会使表情平面稍微离开头部表面一点点,以防止穿插。

现在,表情平面应该已经贴合在头部模型的表面了。

步骤六: 创建表情控制器并用驱动器链接

我们将创建一个简单的圆形对象作为控制器,通过移动这个控制器来切换不同的表情。

方法一:直接关键帧 Offset (简单但不灵活)
你可以直接在 Shading 工作区,选中表情平面的 Image Texture 节点,在 Offset 属性上设置关键帧来切换表情。在时间轴上移动到不同帧,更改 Offset 值(0 代表第一张图,1 代表第二张,以此类推,因为我们有7张图,所以有效值是0-6),然后对 Offset 属性按 I 键插入关键帧。为了实现表情的瞬间切换,可以在时间轴编辑器中选中所有关键帧,右键点击选择 Interpolation Mode -> Constant

方法二:使用驱动器 (推荐)
这种方法更强大且易于管理。

  1. 创建控制器对象:
    • 确保处于 物体模式 (Object Mode)
    • 按下 Shift + A,选择 Mesh -> Circle (圆环)。
    • 旋转圆环使其面向前方:按 R X 90 Enter
    • 调整圆环大小和位置:按 S 缩放,按 G X 将其移动到角色头部的一侧,方便操作。
    • 应用变换: 选中圆环,按 Ctrl + A,选择 Rotation (旋转)。再次按 Ctrl + A,选择 Scale (缩放)。这会将旋转和缩放的当前状态设为默认值。
  2. 设置驱动器:
    • 选中创建的圆环控制器。在右侧属性面板的 对象属性 (Object Properties) 中,找到 Transform (变换) -> Location (位置)。
    • 右键点击 Z 坐标值,选择 Copy as New Driver (复制为新驱动器)
    • 选中表情平面。切换到 Shading 工作区。
    • Image Texture 节点的 Offset 属性上右键点击,选择 Paste Driver (粘贴驱动器)。此时 Offset 属性会变成紫色,表示它由驱动器控制。
  3. 配置驱动器:
    • 在 Blender 界面任意一个编辑器窗口的左上角,点击编辑器类型图标(例如,如果当前是 3D 视图,图标可能是个小方格),从下拉菜单中选择 Drivers (驱动器)
    • 在驱动器编辑器的左侧列表中,展开表情平面的对象 (如 001) -> Shader Nodetree -> Image Texture (或者你为图片纹理节点命名的名称) -> Offset (Image User)。点击它。
    • 在驱动器编辑器的右侧(通常按 N 键调出属性栏,如果未显示),找到 Drivers 标签页。
    • Variables (变量) 部分,你会看到一个名为 var (或类似名称) 的变量,它代表了我们复制的圆环Z轴位置。将这个变量的名称更改为更有意义的词,例如 Emotion
    • Type (类型) 从 Averaged Value (平均值) 改为 Scripted Expression (脚本表达式)。
    • Expression (表达式) 输入框中,输入 round(Emotion * 10)。这里的 Emotion 就是你上一步重命名的变量名。乘以 10 是为了让控制器在 Z 轴上移动较小的距离(如0.1米)就能使 Offset 改变1(即切换到下一张图)。round()函数用于取整,确保我们得到整数帧号。
      • 注意: 教程中最初的表情帧数是 7 (Offset 0-6)。如果控制器Z轴移动 0.1m 对应 Offset 变化 1,那么控制器从Z=0移动到Z=0.6m就能遍历所有表情。
    • 重要:在驱动器编辑器中,展开 Shader Nodetree -> Image Texture 下的 Offset (Image User) 时,下方会显示出该 Image Texture 节点的属性。找到 Frames 属性(注意,这不是指图片序列的总帧数,而是指动画播放时,每一帧图像序列自身前进多少帧)。将其值从默认的7(或你的图片总数)改为 1。这确保了驱动器直接控制 Offset 时,Offset 值的改变就是图像序列帧号的改变。
  4. 约束控制器运动:
    • 选中圆环控制器。
    • 在右侧属性面板中,选择 对象约束属性 (Object Constraint Properties)(图标是一个链条)。
    • 点击 Add Object Constraint (添加对象约束),选择 Limit Location (限制位置)
    • 勾选 Minimum ZMaximum Z
      • Minimum Z 设为 0m
      • 由于我们有7个表情 (Offset 0到6),并且驱动器表达式是 Emotion * 10,所以当控制器Z轴位置 (Emotion) 为 0.6 时,Offset 会是 6。因此,将 Maximum Z 设为 0.6m
    • 勾选下方的 Affect Transform 复选框。
  5. 父子化对象:
    • 首先选中表情平面 (例如 001)。
    • 按住 Shift 键,加选圆环控制器。
    • 再按住 Shift 键,加选头部模型 (Head)。确保头部模型是最后选中的,高亮边框颜色不同。
    • 按下 Ctrl + P,选择 Object (Keep Transform)。现在,移动或旋转头部模型时,表情平面和控制器都会跟随。

步骤七: 动画化表情

现在你可以通过移动圆环控制器来改变角色的表情了。

  1. 选中圆环控制器。
  2. 在时间轴 (Timeline) 编辑器中(如果底部没有,可以将某个窗口切换到 Timeline 编辑器)。
  3. 移动到时间轴的某一帧,例如第 1 帧。
  4. 在 3D 视图中,按下 G 然后 Z,向上或向下移动圆环控制器。观察角色头上的表情变化。
    • 当圆环 Z 轴位置为 0m 时,显示 Offset 0 的表情 (第一张图)。
    • 当圆环 Z 轴位置为 0.1m 时,显示 Offset 1 的表情 (第二张图)。
    • ...
    • 当圆环 Z 轴位置为 0.6m 时,显示 Offset 6 的表情 (第七张图)。
  5. 确定好某一帧的表情后,在圆环控制器的 Location Z 属性上(位于对象属性面板)右键点击,选择 Insert Single Keyframe (插入单个关键帧),或者直接将鼠标悬停在 3D 视图中按 I 然后选择 Location
  6. 移动到时间轴的另一帧,再次调整圆环控制器的 Z 轴位置以选择不同表情,然后再次插入关键帧。
  7. 为了让表情瞬间切换,而不是平滑过渡:
    • 在时间轴编辑器中,确保选中了你设置的所有关键帧。
    • 右键点击,选择 Interpolation Mode (插值模式) -> Constant (恒定)。

现在播放动画,你应该能看到角色的表情根据你设置的关键帧进行切换了。

总结

通过本教程,你学会了两种在 Blender 中为角色创建和动画化 2D 表情的方法,重点学习了如何使用图像序列、调整材质使其不受光照影响、使用收缩包裹修改器贴合表面,以及通过驱动器和控制器来高效管理和动画化表情切换。这种技术对于制作风格化角色动画非常有用,可以快速赋予角色生动的个性。

你可以进一步扩展这个系统,例如添加更多的表情,或者使用更复杂的控制器来同时控制眼睛、嘴巴等不同部位的表情组合。