人体运动捕捉数据格式的研究*
2018-02-12陈燕王强
陈 燕 王 强
(安徽新华学院 安徽合肥 230088)
运动捕捉技术(motion capture)在计算机动画、影视、游戏等领域已得到广泛的应用,其实质是通过在人体关键部位安装运动捕捉装置,实时捕捉真实人体运动状态,并记录人体在运动过程中各个关节旋转数据和约束信息,然后以一定的格式存储在计算机中[1]。由于捕捉设备的原理不同,捕捉的数据存储格式也不相同,主要有:ASF&AMC(acclaim skeleton file,acclaim motion capture data ), HTR (hierarchical translation rotation),BVH,C3D等。
由于捕捉的人体运动数据格式较多,造成数据段通用性不好,使得人体运动捕捉数据的成本还较高。唐琛实现了OGRE描述的运动数据文件到BVH定义的动画文件的格式转换[2]。文章在人体运动捕捉数据格式转换方面做了新的探索,设计实现了一个工具HTA(HTR to acclaim),HTA可以将输入的HTR文件转换为ASF&AMC文件。
1 结构体定义
为实现人体运动捕捉数据格式的转换,先定义缓存区域,以便保存所有输入输出的数据。本文设计结构体:htrFormat和acclaimFormat,对应HTR数据文件和ASF&AMC数据文件。
1.1 结构体htrFormat
HTR文件是Motion Analysis公司定义的文件格式,被划分为4个部分:文件头、骨骼层次的声明、基础位置和数据流[3]。
HTR文件的缓存结构体设计如下:
struct htrFormat {
char *fileTyPe; /*文件类型 */
char *datatype; /*数据类型 */
int fileVersion; /*文件版本*/
int numSegments; /*骨骼数*/
int numFrames; /*总帧数*/
int dataFrameRate; /*帧采样速率 */
char *eulerRotationOrder; /*旋转顺序*/
char *calibrationUnits; /*平移的数据单位*/
char *rotationUnits; /*旋转的数据单位*/
char *globalAxisofGravity; /*全局垂直方向*/
char *boneLengthAxis; /*沿骨骼的轴*/
float scaleFactor; /*缩放因子*/
struct htrSegmentHierarchy *childParent; /*层次*/
struct htrBasePosition *basePosition; /*基础位置*/
struct htrSegmentData *segmentData; /*骨骼段数据*/
结构体前12个成员变量对应HTR文件头部分,后3个成员变量为结构体类型,负责记录HTR文件中的骨骼层次的声明、基础位置和数据段信息。
1.2 结构体acclaimFormat
ASF&AMC是Acclaim公司定义的数据格式,共包含两个文件: 骨骼文件ASF和运动文件AMC[4]。ASF文件是层次模型文件,主要储存人体骨架结构数据,共31个关节点,其中根节点是其他节点的父节点。AMC文件用于储存每一帧的运动数据。该运动数据按照一定的频率进行采样得到若干运动帧数据,每帧数据包含若干行,由所有关节的运动信息组成,其中根关节包括平移和旋转信息,其它关节只包括旋转信息,以一种分层的方式来存储[5]。
acclaimFormat记录ASF、AMC文件中的数据,具体设计如下:
struct acclaimFormat {
char *version; /*文件版本*/
char *name; /*设备名称 */
float unitsMass; /*质量系数*/
float unitsLength; /*长度系数*/
char unitsAngle[5]; /*角度*/
char * documentation; /*注释 */
char rootOrder; /*根节点的变换顺序*/
char rootAxis[5]; /*初始旋转顺序*/
double rootPosition[3]; /*初始位置*/
double rootOrientation[3]; /*初始旋转值*/
struct acclaimBoneData * boneData; /*骨骼段数据*/
struct acclaimHierarchy *hierarchy; /*层次数据*/
struct acclaimFrameData *frameData; /*帧数据*/
};
acclaimFormat后3个成员变量为结构体类型,分别记录骨骼信息、骨骼层次关系和AMC文件中的数据。
2 HTR文件解析
结构体定义后,数据格式的转换首先要把已有的HTR数据文件写到数据缓存中。定义结构体htrFormat的变量htrFile和存放解析的标记的指针数组token。
具体过程如下:
(1)打开HTR文件;
(2)根据关键字[Header]找到文件头部分。依次解析文件头的12部分信息,保存到htrFile的相应成员变量中,如FileTyPe的处理如下:
htrFile->fileType=(char *)malloc((strlen(token[1])+1)*sizeof(char)); /*分配内存*/
strcpy(htrFile->fileType, token[1]); /*保存类型*/
(3)根据关键字[SegmentNames&Hierarchy]找到骨骼层次部分。首先根据骨骼段数分配所需的内存,然后根据骨骼数目循环解析每一骨骼的层次信息并保存到htrFile的成员变量childParent中。childParent也是结构体类型,由child和parent两个成员变量来表明当前骨骼和其父骨骼。
(4)根据关键字[BasePosition]找到基础位置部分。根据骨骼数目循环解析每一骨骼的8种信息并保存到htrFile的成员变量basePosition中。basePosition也是结构体类型,由name、boneLength、位置信息(tx、ty、tz)和旋转信息(rx、ry、rz)。
(5)最后一部分为数据信息。根据骨骼段名称依次解析每段骨骼的帧数据,保存在htrFile的成员变量segmentData中。segmentData也是结构体类型,由segmentName、frame组成,其中frame为结构体类型变量,成员变量为帧号frameNo、平移信息(tx、ty、tz)、旋转信息(rx、ry、rz)和缩放系数SF。
3 htrFormat到acclaimFormat
当HTR文件中的数据写入到内存后,就可以移入acclaimFormat类型的结构体变量acclaimFile中。过程如下:
(1)acclaimFormat的成员中是简单信息的可直接写入,如:strcpy(acclaimFile->version,“1.10”)。
(2)根据htrFile->eulerRotationOrder决定的旋转顺序,在平移顺序不变的情况下写入acclaimFile->rootOrder和acclaimFile->rootAxis的值。将HTR文件的父节点作为根节点的孩子节点,所以acclaimFile->rootPosition和acclaimFile-> rootOrientation均为0。
(3)对于boneData部分,其name、length、axis、dof可根据htrFile->basePosition的name、bonelength和旋转旋转信息(rx、ry、rz)写入,direction由globalAxisofGravity决定,dofNumber、limits、bodyMass、cofMass根据情况直接赋值。
(4)对于层次部分,ASF是先列出父骨骼,再是所有的子骨骼,与HTR文件差别很大。所以,需要先求出有多少骨骼带有子骨骼。先处理父节点为GLOBAL的节点,添加其所有子节点,然后再依次处理其他带子节点的节点。
(5)对于运动数据部分,循环处理每一帧,帧数为htrFile->numFrames的值。先处理每帧的根节点,其数据信息均为0。再处理其他骨骼数据(平移和旋转),如:
acclaimFile->frameData.motionData.tx = htrFile-> segmentData.frame.tx;
4 ASF&AMC文件填充
文件转换的最后一步就是把缓存中的数据填充到ASF&AMC文件中。
(1)根据ASF文件的结构逐步将acclaimFile中的数据写入其中,如:
fprintf(asfFileHandle,”:version %s n”, acclaimFile->version);
fprintf(asfFileHandle,”:root n”);
fprintf(asfFileHandle,” order %s n”, acclaimFile->rootOrder);
fprintf(asfFileHandle,”: bonedata n”).
(2)根据AMC文件的结构逐步将acclaimFile中的运动数据写入其中。依次处理各帧数据:先写入帧号;再写入根节点数据;写入本帧的骨骼数据,包括骨骼名称和根据自由度写入的各个具体数据。
5 结论与展望
文章设计的人体运动捕捉数据格式工具HTA,能很好将HTR文件转换为ASF&AMC文件。不过转换只涉及到两种格式,后期还需要对缓存结构进行改善,以设计一种能应用在多种人体运动捕捉数据格式之间转换的更泛化的缓存结构。
参考文献:
[1]孙丽雅.基于运动捕捉数据的人体运动分割和标注技术[D].北京:北京交通大学,2015.
[2]Tan CH,Hou J,Chau LP. Human motion capture data recovery using trajectory-based matrix completion[J]. IET Electronic Letter,2013,49(12): 752.
[3]王德成,陈燕.基于HTR文件的人体动画的实现[J]. 西安文理学院学报(自然科学版),2014,17(3):63.
[4]于晓敏.数据驱动的虚拟人运动分析与合成技术研究[D].北京:北京交通大学,2017.
[5]杜战战. 人体运动捕获数据的分析方法研究[D].南京:南京理工大学,2015.