基于惯性动作捕捉的人体运动姿态模拟
摘 要:针对人体运动姿态编辑的自由性,提出一种人体运动姿态模拟方法。该方法采用贝塞尔曲线和数值数据编辑人体运动姿态。根据人体运动的特点,在VC++中运用OpenGL 构建虚拟人体模型,利用物理惯性动作捕捉技术设计人体运动姿态的模拟程序。结合人体关节正常活动范围,对主要关节点的运动姿态进行分析,结果表明,该方法能有效利用人体运动数据,驱动虚拟人体模型。
1 概述
近年来,动作捕捉技术已成为人体运动姿态研究中的一项关键技术,发挥着越来越重要的作用,人们意识到非常有必要通过模拟人体运动姿态以实现人体三维骨架的可视化和自由编辑控制功能。目前,国内外许多学者利用动作捕捉技术在人体运动姿态领域做了大量的研究。如利用动作捕捉系统捕捉人体运动姿态数据,通过对数据进行傅里叶变换处理,并将处理后的数据应用于机器人研究。
利用动作捕捉数据库中的数据对人体的正常与不正常运动姿态进行分析。利用VC++构建了基于OpenGL技术的人体运动姿态模拟程序,能够灵活利用采集得到的人体运动数据驱动人体模型。这些学者侧重于在对人体运动姿态数据的分析处理后,实现人体运动姿态的模拟,但是在对人体运动姿态的自由编辑控制方面并不够完善。
本文针对人体运动姿态自由编辑控制的不完善性,以VC++和OpenGL 为工具,读取动作捕捉文件数据,结合人体关节正常活动范围、贝塞尔曲线特性和数值数据的自由性,实现人体运动姿态的模拟和人体运动姿态的自由编辑控制。
2 人体运动数据采集
2.1 数据采集设备
运动捕捉系统是一套惯性动作捕捉系统,主要包括以下4 个部分:
(1)传感器,其主要用来向计算机提供运动物体的相关信息;
(2)信号捕捉设备,主要负责信号的捕捉;
(3)数据传输设备,将捕捉到的数据实时地传输至计算机;
(4)数据处理设备,主要负责对采集到的数据进行加工、处理,包括数据处理硬件(如计算机等)和软件设备(如MotionBuilder 等动画制作软件)。
物理惯性动作捕捉的操作过程非常简单,并且与光学动作捕捉系统相比对环境的要求相对较低,只需要将衣服设备穿在被捕捉的物体上,将各个传感器连接起来,记录传感器在人体相应位置的编号后即可进行实时地动作捕捉。
2.2 数据格式
数据格式.bvh 文件格式,动作捕捉系统捕捉到的数据可以用.fbx、.bvh、.crt 等格式进行保存,由于本文需要有具体的数值数据作为支撑, 因此需将数据导出为.bvh 格式文件。.bvh 文件数据以树形、人体骨架层次结构的形式进行存储。.bvh 文件由2 个部分组成,即:骨架信息数据块和运动关键帧数据块。简化的.bvh 格式文件如下:
HIERARCHY
ROOT Hips
{
OFFSET 0 0 0
CHANNELS 6 Xposition Yposition Zposition Zrotation
Xrotation Yrotation
JOINT Spine
{
OFFSET 4.56445 -0.004928 0
CHANNELS 6 Xposition Yposition Zposition Zrotation
Xrotation Yrotation
…
JOINT Head
{
OFFSET 4.2853 -0.00104196 0
CHANNELS 6 Xposition Yposition Zposition
Zrotation Xrotation Yrotation
End Site
{
OFFSET 0 0 0
}
}
}
…
}
MOTION
Frames: 497
Frame Time: 0.0333333
0 0 0 -83.486 6.97973 -89.4832 4.56445 -0.004928 5.96046e-006 12.7676 -4.98822 0.165202 6.19142 -0.00493005 0 3.65836e-027-1.64758e-011 1.27222e-014 6.19143 -0.00493024 0 3.65836e-027-1.64758e-011 1.27222e-014 6.19143 -0.00492986 0 3.65836e-027-1.64758e-011 1.27222e-014 6.19143 -0.00237059 0 3.65836e-027-1.64758e-011 1.27222e-014 4.2853 -0.00104196 0 -3.27451 1.52613-1.33371 6.19143 3.72529e-006 -1.38918 -172.433 -11.3909 71.89985.15981 -1.86265e-007 0 -32.0041 -5.43845 -48.3084 13.8515 0 0-22.0691 -5.98704 3.88049 13.3125 -1.86265e-007 0 -133.479 78.7673137.986 6.19143 -3.91155e-006 1.38918 -176.892 2.02155 -74.79895.15981 1.86265e-007 0 -38.9631 14.5098 51.8048 13.8515 0 0-25.1521 -5.63188 -5.5987 13.3125 0 0 -171.06 -80.9631 -170.413-5.96046e-006 7.26432e-006 3.96908 14.7087 4.5087 -176.284 19.84540 -7.45058e-007 -3.82447 -0.175513 2.65823 15.8293 0 0 18.6738-8.96321 -0.541735 5.96046e-006 -3.91156e-006 -3.96908 11.11716.78621 175.569 19.8454 0 1.49012e-006 -1.67835 4.88771 -0.72630815.8293 0 0 5.58702 11.4992 1.35837
.bvh 文件骨架信息块以“HIERARCHY”开头,接着是“ROOT”,表示动作捕捉数据的根节点(本实验所设定的人体根节点为臀部Hips),接下来的节点是根节点的子节点,以“JOINT”为关键字来标识,其后连接节点名称,再接下来的关键字“OFFSET”,表示该节点的相对于父节点的偏移量信息,关键字“CHANNELS”紧接着是一个数字指示通道数, 实验所保存的.bvh 格式文件数据都为6 个通道,即Xposition Yposition Zposition Zrotation Xrotation Yrotation。用“{”、“}”表示节点的子节点名称及子节点偏移量信息和旋转角度信息。没有子节点的节点以“End Site”标识结束。
.bvh 数据的第2 部分为运动捕捉关键帧数据部分,它所记录的关节点每一帧相对于父节点的偏移量和旋转角度值与第一部分的骨架层次结构信息数据是相对应的。数据信息部分是以“MOTION”开头,“Frames:”表示动作捕捉数据的帧数。“Frame Time:”表示数据的采样频率。接下来的是具体关键帧数据,以换行符来标识一帧内容。
.bvh 文件数据是按帧进行存储的,在人体骨骼创建阶段,为人体创建21 块骨骼,由于每一块骨骼都包含6 个数据(Xposition, Yposition, Zposition, Zrotation, Xrotation,Yrotation),因此.bvh 文件数据块一帧中包含126 个数据。每一骨骼数据块信息都包含位置信息和旋转信息2 个部分,本文在动作捕捉数据采集过程中将人体根节点Hips 设定为静止,因此,位置信息是静止的。故在利用程序读取数据时,只需要相对于父节点的旋转数据。鉴于以上情况,本文所使用到简化的.bvh 骨架结构如图所示。
由于物理惯性动作捕捉系统总共有17 个传感器,以便捕捉人体主要关节点的数据,因此在将传感器与三维人体进行绑定时,需首先将传感器与人体对应的部位进行衔接,并记录传感器编号。按人体骨架的结构为人体建立了多块骨骼,实验并不需要全部的骨骼数据,因此,只提取了人体四肢数据。
2.3 数据采集
数据采集是传感器自动采集人体的位置、角速度和旋转角度等信息的过程。为了能直观演示人体的相关信息,需要为人体的骨骼创建皮肤。本实验所需的皮肤模型是利用3DMAX 2009 来制作的。骨骼模型的创建采用的是Biped 骨骼,骨骼与皮肤通过蒙皮来实现它们之间的关联。在制作蒙皮的过程中,分别对模型使用了Physique 蒙皮修改器和Skin 蒙皮修改器进行了对比,使用Skin 蒙皮制作过程较繁琐,而Physique 蒙皮相对简单,在蒙皮制作过程中需要不断地测试,并调整蒙皮参数。蒙皮过程完成后将.max 三维模型导出格式为.fbx 的文件,将模型导入Motionbuilder 中,进行人体的运动捕捉,具体流程如图3 所示。
3 人体运动姿态模拟
模拟人体的真实运动需以数据为支撑,实验所用到的数据以.bvh 格式存储,利用VC++和OpenGL 程序模拟人体运动姿态,并对人体的运动姿态进行质和量的研究分析。
3.1 程序实现
3.1.1 人体骨架模型建立
人体是一个非常复杂的系统,由200 多个旋转关节组成[5],如果需要模拟出更逼真的人体运动,需提供人体所有关节的旋转角度值和位置等相关信息。因此,对于人体运动姿态的模拟,首先要建立逼真的人体骨架模型,再通过数据驱动人体模型的运动,模拟人体的运动姿态。
本文所使用的人体骨架模型利用VC++和OpenGL 自定义函数绘出,利用DrawTheGuy_WC()函数绘制人体线型简化模型,如图4(a)所示,DrawTheGuy_SL()函数绘制人体曲面模型,如图所示,利用DrawTheGuy_MAN()函数读取3DMAX 创建的.3ds 模型,如图所示。
在读取人体模型man.3ds 模型之前, 将一个完整的man.3ds 人体模型,按照人体结构进行分解,分离出11 个部分,利用OpenGL 和VC++函数编写的.3ds 模型解析文件3ds.cpp 读取人体四肢模型。读取到的关节数据都用列表进行存储,用OpenGL 中的函数glCallist 调用需要的列表,即骨架模型, 并将其组合成完整的三维人体模型。通过调用OpenGL 的glTranslatef()函数以及glRotatef()函数完成对整个人体骨架模型矩阵的变换运算,利用函数glPushMatrix()和glPopMatrix()完成模型父子关系之间的压栈[6]操作,以免影响后续节点。
3.1.2 人体运动姿态编辑
人体运动姿态研究是运用动作捕捉技术,捕捉人体运动,获取人体运动参数,并从运动中重建人体的结构和姿态,实现人体运动姿态的分析和模拟。本文主要采用贝塞尔曲线和数值数据2 种方法对人体运动姿态进行编辑,运用动作捕捉技术获取人体运动参数,模拟人体运动姿态。
(1)贝塞尔曲线
贝塞尔曲线[7]可以灵活地使用鼠标自由地编辑曲线,形成人体运动规律曲线,自由编辑人体运动姿态。贝塞尔曲线是二维图形应用程序的数学曲线,给出n+1 个控制点位置:Pk=(xk, yk, zk), (0<k<n),这些坐标点将混合产生位置向量P(u),用来描述P0 至Pn 间逼近贝塞尔多项式函数路径:
贝塞尔混合函数为:
其中,参数C(n, k)是二项式系数:
式(1)表示单个曲线坐标3 个参数方程的集合:
贝塞尔曲线是一个阶数比控制点数少1 的多项式,本实验生成一个由4 个控制点组成的三次贝塞尔曲线,绘制沿曲线路径的100 个像素位置,因此,将n=3,代入式(2),得到3 次贝塞尔曲线的4 个混合函数:
混合函数决定了控制点如何影响曲线的形状。此时,将混合函数和约束扩展为多项式,那么3 次贝塞尔函数可以写成矩阵形式为:
其中,MBez 矩阵为:
将P(u)的值传递给人体关节结构变量:Walk_cycle[DIRECTION][NUM_JOINTS][CYCLE_SIZE]利用OpenGL 函数绘出像素点P(u)的位置,达到控制人体运动的目的。
贝塞尔曲线如图5 所示,总共绘制了5 根贝塞尔曲线,从上至下分别为髋关节、膝关节、踝关节、肩关节和肘关节。
每一曲线控制人体四肢对称的2 个关节,竖线2 根与贝塞尔曲线的交差点为传递给对应关节的旋转角度。左边的竖线控制人体左半部分关节,右边的竖线控制人体右半部分关节。如:在踝关节曲线,左竖线控制左脚的踝关节,右竖线控制右脚的踝关节,编辑贝塞尔曲线或移动竖线的位置改变关节旋转角度,模拟人体运动姿态。竖线的运动将使旋转角度值也发生变化,形成人体动画,可以将此编辑曲线的数值以自定义格式.cset 保存。图5 为正在编辑踝关节的旋转角度,与之对应的人体姿态如图6 所示。
(2)数值数据
动作捕捉获取的数据将其与人体运动姿态模拟程序结合,利用ReadBvhFromFile(char *filename)读取.bvh 文件中的数据部分的数值,将.bvh 文件中的数据部分的数值序号与模型的关节点所需要的数值进行对应,结合人体关节正常活动范围[8](如表1 所示),模拟人体的真实运动。
由于贝塞尔曲线的控制只能使人体关节绕x 轴旋转,为使人体运动姿态的模拟更逼真,通过修改数值从而达到修改人体关节旋转角度值,并将关节旋转角度范围设定为人体关节正常活动范围。因此,读取到的.bvh 旋转角度值如果超出人体关节正常活动范围,则可判定关节存在异常。程序实现所需要的主要函数事件过程及数据结构如下:
typedefstruct _place {
int id; //定义数据编号
int x, y; //数据的在窗口中显示的位置
float min, max; //活动范围
float value; //窗口中显示的值
float step; //拖动鼠标增加的大小
char* info; //单击鼠标时的提示
char* format; //数据显示的格式
} place;
void place_draw(place* place); //绘出桌面的文字
void place_update(place * place, int update); //数据的更新
void bvhdata_display(void); //提取.bvh 文件中数据
{
for(line=0;line<frames;line++) //读取帧
for(index=0;index<30;index++)
{
number++;
if(number= data ||number=…) //提取每一行固定的几个值
place[index].value=bvhdata[line][number]; //把.bvh 文件中提取
//的数值付给窗口中显示数值的数组
}
for(i=0;i<2;i++)
for(j<0;j<5;j++)
for(k=0;k<3;k++)
{
walk_angle[i][j][k]=place[index].value; //将窗口中的数值与旋转角度结合
}
}
3.2 结果分析
根据研究内容,本文选用一段人体室内正常行走的运动和跑步运动作为了输入运动。提取人体四肢运动数据,模拟人体的手臂和腿部的运动,但由于人体的头部和躯干静止不动,导致模拟出的结果出现四肢不协调,与动作捕捉到的人体动画在逼真性上存在差距。结合人体关节正常活动范围和.bvh 四肢旋转角度值,分析出关节的症状,从而可将此实验应用到医学领域。利用贝塞尔曲线模拟四肢简单运动,表示了旋转角度运动的规律及四肢运动之间的相互关系,以及人体运动的周期性运动,从而反映人体运动姿态的简单规律。
4 结束语
人体运动姿态模拟是动作捕捉技术的一个重要方向,用惯性运动捕捉设备获取数据应用到人体运动姿态研究中具有效率高、操作简便等特点,因此,在各领域得到广泛应用。本文介绍了惯性动作捕系统,从.bvh 数据文件、贝塞尔曲线和数值数据等方面对人体运动姿态进行研究,并实现了人体运动姿态模拟程序,该模拟程序可应用于医学、教学等领域。在此研究基础上,可以对骨架模型加以改进,进一步细化人体关节,将自定义的.cset 格式文件与.bvh 文件进行转换,模拟出更加逼真的人体运动姿态,这也是下一步的研究方向。
>>相关产品