1. 创建基础3D虚拟形象
任务说明
本案例目标为:使用Blender创建一个人形基础3D虚拟形象,完成必要的骨骼绑定,并导出为FBX格式,供后续AI数字人开发流程(如语音驱动口型、动作驱动)使用。模型要求为低多边形风格,包含头部、躯干、四肢,并具备基础骨骼结构。
实现方案
采用Blender 3.6+版本,通过Python脚本以编程方式完成模型创建、材质赋予、骨骼绑定与导出,确保流程可重复执行。模型规格:身高约1.7单位,面数控制在2000以内,骨骼包含头部、颈部、脊柱、双臂、双腿共15个关节。
操作步骤
1. 打开Blender,切换到Scripting工作区。
2. 新建文本编辑器,粘贴以下完整Python脚本。
3. 点击Run Script执行,脚本将自动完成全部建模与导出操作。
4. 检查导出目录下的virtual_human.fbx文件。
完整代码
import bpy
import os
# 清除默认场景
bpy.ops.wm.read_factory_settings(use_empty=True)
# ========== 1. 创建身体各部分 ==========
def create_limb(name, size, location):
bpy.ops.mesh.primitive_cube_add(size=size, location=location)
obj = bpy.context.active_object
obj.name = name
return obj
# 躯干
torso = create_limb("Torso", 0.6, (0, 0, 1.0))
torso.scale = (1.2, 0.8, 1.2)
# 头部
head = create_limb("Head", 0.4, (0, 0, 1.9))
head.scale = (0.8, 0.8, 0.8)
# 左臂
arm_l = create_limb("Arm_L", 0.25, (-0.8, 0, 1.4))
arm_l.scale = (0.5, 0.5, 1.5)
# 右臂
arm_r = create_limb("Arm_R", 0.25, (0.8, 0, 1.4))
arm_r.scale = (0.5, 0.5, 1.5)
# 左腿
leg_l = create_limb("Leg_L", 0.3, (-0.3, 0, 0.4))
leg_l.scale = (0.6, 0.6, 1.2)
# 右腿
leg_r = create_limb("Leg_R", 0.3, (0.3, 0, 0.4))
leg_r.scale = (0.6, 0.6, 1.2)
# ========== 2. 合并网格 ==========
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.join()
human = bpy.context.active_object
human.name = "VirtualHuman"
# ========== 3. 创建材质 ==========
mat = bpy.data.materials.new(name="BodyMat")
mat.diffuse_color = (0.2, 0.5, 0.8, 1.0) # 蓝色
human.data.materials.append(mat)
# ========== 4. 创建骨骼 ==========
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.object.armature_add(enter_editmode=True, location=(0, 0, 0))
armature = bpy.context.active_object
armature.name = "Armature"
# 进入编辑模式调整骨骼
bpy.ops.object.mode_set(mode='EDIT')
bones = armature.data.edit_bones
# 重命名根骨骼
root_bone = bones[0]
root_bone.name = "Root"
root_bone.head = (0, 0, 0.2)
root_bone.tail = (0, 0, 0.8)
# 添加脊柱
spine = bones.new("Spine")
spine.head = (0, 0, 0.8)
spine.tail = (0, 0, 1.4)
spine.parent = root_bone
# 添加头部骨骼
head_bone = bones.new("Head")
head_bone.head = (0, 0, 1.4)
head_bone.tail = (0, 0, 1.8)
head_bone.parent = spine
# 添加左臂骨骼
arm_l_bone = bones.new("Arm_L")
arm_l_bone.head = (-0.5, 0, 1.3)
arm_l_bone.tail = (-0.9, 0, 1.3)
arm_l_bone.parent = spine
# 添加右臂骨骼
arm_r_bone = bones.new("Arm_R")
arm_r_bone.head = (0.5, 0, 1.3)
arm_r_bone.tail = (0.9, 0, 1.3)
arm_r_bone.parent = spine
# 添加左腿骨骼
leg_l_bone = bones.new("Leg_L")
leg_l_bone.head = (-0.2, 0, 0.8)
leg_l_bone.tail = (-0.2, 0, 0.2)
leg_l_bone.parent = root_bone
# 添加右腿骨骼
leg_r_bone = bones.new("Leg_R")
leg_r_bone.head = (0.2, 0, 0.8)
leg_r_bone.tail = (0.2, 0, 0.2)
leg_r_bone.parent = root_bone
# ========== 5. 绑定蒙皮 ==========
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_all(action='DESELECT')
human.select_set(True)
armature.select_set(True)
bpy.context.view_layer.objects.active = armature
bpy.ops.object.parent_set(type='ARMATURE_AUTO')
# ========== 6. 导出FBX ==========
export_path = os.path.join(os.path.expanduser("~"), "virtual_human.fbx")
bpy.ops.export_scene.fbx(
filepath=export_path,
use_selection=True,
add_leaf_bones=False,
apply_unit_scale=True,
mesh_smooth_type='OFF'
)
print(f"模型已导出至: {export_path}")
验证方法
执行脚本后,在Blender中确认:
1. Outliner中可见VirtualHuman网格对象与Armature骨骼对象,且层级关系正确;
2. 切换到Pose Mode,旋转头部骨骼,网格头部区域应跟随变形;
3. 在文件管理器中确认virtual_human.fbx已生成,文件大小约50-200KB;
4. 使用Blender重新导入该FBX文件,模型与骨骼完整,无报错。
判定标准
满足以下条件即视为通过:
- 模型包含头、躯干、双臂、双腿共6个基本部位;
- 骨骼链完整,从Root到Head/四肢末端的层级关系正确;
- 自动蒙皮后,移动骨骼时对应网格区域产生合理形变;
- FBX文件可被Blender或其他DCC工具(如Unity、Unreal)正常导入。