介绍
SMPL
SMPL(Skinned Multi-Person Linear model)是一个用于人体建模的计算机图形学模型,由德国马普所(Max Planck Institute)的研究人员开发。SMPL模型通过一组参数来描述人体的形状和姿态,这些参数可以分为两大类:形状参数(Shape Parameters)和姿态参数(Pose Parameters)。
形状参数(Shape Parameters)
形状参数描述了人体的静态特征,如身高、体重、肌肉定义等。这些参数通常是一个高维向量,每个元素对应人体形状的一个特定方面。SMPL模型通常使用一个10维的形状参数向量,每个元素控制人体的一个线性组合的形状变化。
姿态参数(Pose Parameters)
姿态参数描述了人体的动态特征,即人体的动作和姿态。这些参数通常是一个高维向量,每个元素对应一个关节的旋转角度。SMPL模型使用一个72维的姿态参数向量,其中:
- 前3个参数描述全局旋转(通常是根节点的旋转)。
- 接下来的69个参数描述23个关节的相对旋转(每个关节3个旋转角度)。
具体参数内容
形状参数:
- 10个线性权重,用于控制人体的形状变化。
姿态参数:
- 3个全局旋转参数。
- 23个关节,每个关节3个旋转角度(共69个参数)。
通过调整这些参数,SMPL模型可以生成各种不同形状和姿态的人体模型。这些模型可以用于计算机图形学、动画、虚拟现实、人体运动分析等多个领域。SMPL模型的灵活性和逼真度使其成为人体建模和动画制作中的一个重要工具。
SMPLX
SMPLX(Skinned Multi-Person Linear model extended)模型的姿态参数用于描述人体的动作和姿态。这些参数通常包括以下几个方面:
全局旋转:描述整个人体的方向和位置,通常包括三个旋转角度(例如,欧拉角或四元数表示的旋转)。
关节角度:描述每个关节的旋转,包括:
- 身体的主要关节,如脊柱、肩膀、臀部等。
- 手指和脚部的关节,每个手指和脚趾都有多个关节。
面部表情参数:描述面部肌肉的运动,用于模拟表情变化。这些参数通常是线性的权重组合,用于控制面部形状的变化。
手势参数:专门用于描述手部的动作,包括手指的弯曲、伸展和扭曲。
SMPLx的姿态参数通常以向量形式表示,其中每个元素对应一个特定的关节或面部特征的旋转角度或变形权重。这些参数可以通过运动捕捉数据、动画制作软件或机器学习算法生成。
具体来说,SMPLx的姿态参数向量可能包含以下内容:
- 全局变换:3个参数(例如,全局位置和方向)。
- 身体关节:21个关节,每个关节3个旋转角度(共63个参数)。
- 手指关节:每只手15个关节,每个关节3个旋转角度(共90个参数)。
- 面部表情:一组权重参数,用于控制面部形状的变化(具体数量取决于模型的定义)。
这些参数共同定义了人体的完整姿态,从整体的运动到手指和面部的细微动作。通过调整这些参数,可以生成各种逼真的人体动作和表情。
相关工具
SMPL to BVH
- https://github.com/KosukeFukazawa/smpl2bvh 可以完成 SMPL 转 BVH。
- 如下脚本可以导入bvh到blender
import bpy
import mathutils
import json
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--camera_file', type=str, default='/root/dream-cinema/blender/slam_cams.json', help='camera file path')
parser.add_argument('--bvh_file', type=str, default='/root/dream-cinema/blender/human_0_A.bvh', help='bvh file path')
parser.add_argument('--output_blend_file', type=str, default='/root/dream-cinema/blender/output.blend', help='output blend file path')
args = parser.parse_args()
with open(args.camera_file, 'r') as f:
camera_params = json.load(f)
# 删除现有的相机
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.object.select_by_type(type='CAMERA')
bpy.ops.object.delete()
# 添加一个新的相机对象
bpy.ops.object.camera_add()
camera_obj = bpy.context.object
param_0 = camera_params[0]
#param_0 = mathutils.Matrix(param_0)
# 遍历每个关键帧的参数
for frame, params in enumerate(camera_params):
bpy.context.scene.frame_set(frame)
# Extract position and rotation from the parameters
location = [params[i][3] for i in range(3)]
rotation = [[params[i][j] for j in range(3)] for i in range(3)]
# Apply position and rotation to the camera object
camera_obj.location = location
camera_obj.location[0] += 0
camera_obj.location[1] += 0
camera_obj.location[2] += 0
camera_obj.rotation_euler = mathutils.Matrix(params).to_euler('ZYX')
# Optionally, keyframe camera's location and rotation for animation
camera_obj.keyframe_insert(data_path="location", index=-1)
camera_obj.keyframe_insert(data_path="rotation_euler", index=-1)
# 导入bvh文件
bpy.ops.import_anim.bvh(filepath=args.bvh_file)
# 保存blender项目
bpy.ops.wm.save_as_mainfile(filepath=args.output_blend_file)
SMPL、SMPL-X、SMPL-H 互相转换
SMPL-X 导入 Blender
- 一个比较好的方式是采用官方的Blender插件
- 介绍视频: https://www.youtube.com/watch?v=BSVJ7N2910g
- Blender插件下载地址: https://smpl-x.is.tue.mpg.de/
没有帐号? 立即注册