我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>行业知识

DI-Guy中人体动作生成方法研究

文章来源:第三维度 作者: 发布时间:2012年03月30日 点击数: 字号:

    来源:第三维度
    作者:李石磊,梁加红,柏友良,陈凌
    单位:国防科技大学机电工程与自动化学院

    摘要:针对实时人物动作角色软件DI-Guy在运动编辑及新动作生成方面的局限,提出了结合3D人体动画软件及标准动作捕捉数据文件在Vega环境中基于DI-Guy平台进行虚拟人动作生成的开发思路,给出了人体动作建模软件Poser中动作数据文件生成的详细开发过程,分析了Vega环境下动作捕捉数据文件的应用方法。依据上述开发思路进行了DI-Guy下用户定制动作的添加生成,所添加、定制的动作逼真、形象,而且系统运行速度不受影响,同时系统也可直接调用DI-Guy原有高层动作函数,大大方便了应用系统的开发。实验结果表明开发模式对于扩展DI-Guy的应用范围及提高虚拟人应用系统的开发效率具有重要的实用价值。

    l 引言

    随着虚拟现实技术在虚拟展示、游戏娱乐及教育培训中的广泛应用,人们对系统的逼真性与沉浸性提出了更高的要求。虚拟人作为现实世界中的用户在虚拟世界中的替身或交互对象,对于提高虚拟现实应用系统的沉浸感具有十分重要的作用,因此虚拟人的几何建模、动作建模及更高层次的行为建模成为当前的研究热点。

    DI-Guy是由美国Boston Dynamic公司于上个世纪九十年代初开发的一套给实时仿真环境添加真实人物角色的软件,通过高层API函数用户可以方便地实现虚拟人的行走、匍匐前进、使用武器及其它活动,并与视景驱动软件Vega实现了无缝集成,具有简单、逼真、快捷的优点,极大地简化了应用系统开发,从而得到了广泛的应用。但DI-Guy中的各种行为动作都已事先定制封装,用户只能通过高层API函数‘实现对现有动作的调用,不具备动作编辑功能,难以实现用户自定义动作的添加开发。在实际系统开发中(如文献[2])一般在Vega环境下通过程序协调控制人体模型中各个关节DOF节点(Degree of Freedom nodes)的方式实现新动作的编辑生成,但人体关节众多,生成逼真的人体动作需要繁琐的调试过程,效率低下。结合实际需求,本文提出利用3D人体动画软件Poser在动作编辑、生成方面的优势,以所见即所得的方式实现新动作的编辑生成,进而基于标准动作捕捉数据文件,方便地实现了Vega环境下基于DI-Guy平台的虚拟人复杂动作编辑生成与实时驱动控制。

    2 虚拟人动作控制方法

    当前虚拟现实应用中3D虚拟人运动效果一般基于骨架运动学的方法生成。人体关节之间由骨骼相连,骨骼之间通过关节的相互连接构成骨骼树,即骨架。在某一时刻,给定骨架根关节的位置和各关节旋转角度,即可确定人体各段骨骼的位姿,称为虚拟人体动作的关键帧。可认为关键帧是人体骨架在某一特定时刻的配置,该配置决定了骨架中的每一骨骼的旋转姿态。在生成各关键帧后,通过插值方式生成中间各帧骨骼姿态。最终基于骨骼蒙皮(skinning mesh)方法通过骨骼改变几何外观模型,生成人体动作效果。当前,常用的骨架关键帧生成方法有:

    1)手工编辑:通过用户手工调节的方式生成骨架的各种关键姿态。当前,常用的3D人体动画软件如3d max(charac.ter studio)、Poser等都是通过用户交互界面生成骨架的各种关键姿态。

    2)逆向运动学方法:在某些应用中,人体末端关节的位姿已知,此时可基于逆向运动学方法生成各中间关节的位姿。求解方法可分为数值法和解析法,数值法通过迭代的方法求解,速度较慢;解析法速度较快,但只适用于关节较少的情况。

    3)动力学方法:可大致分为基于轨迹的方法和基于控制器的方法两种。基于轨迹的方法采用优化算法在人体姿态空间中实现骨架位姿从一点到另一点的变换,通过添加约束使姿态变换满足物理逼真性要求。基于控制器的方法通过控制器模型产生人体各关节的控制力矩,并通过人体动力学仿真模型计算人体各关节的角速度,最终确定人体运动过程中各关节的姿态角,但设计开发一个适用于各类动作的控制器模型难度很大。

    4)运动捕捉:运动捕捉方法一般通过一些传感数据如电磁系统、光标、视频等,获取人体骨架关节在离散时间点上的姿态信息,利用从外部记录的人体运动数据直接生成人体动画,避开了人体建模这一复杂问题,从上世纪90年代开始逐渐推广。被视为最有前途的运动建模手段。

    当前常用的动作捕捉数据文件格式有:BVH、HTR、ASF/AMC等,它们大多包含有骨架的定义、采样的频率、各个基本数据元素、数据的单位以及随时间变化的各运动参数的数据信道等信息。如BVH文件包含两部分:文件头部和运动数据块。文件头部从“HIERARCHY”开始,进行骨架的定义和描述;然后是实际的运动数据,每一行的数据表示每一帧的运动姿态,各个数据项的次序与前面骨架定义中各个关节点的次序相同。

    基于虚拟人动作生成方法研究现状,本文采用手工编辑和运动捕捉相结合的方法生成人体运动数据;某些人体动作数据文件如行走、奔跑等可直接从网络上下载;但根据应用系统需求定制的动作数据文件往往需要白行开发,本文基于3D人体动作建模软件Poser7.0开发生成。

    3 基于Poser的人体动作数据生成

    Poser是一款强大的人体形象和动画设计软件H,lJ,它提供了丰富的人物模型和动画素材,使用Poser可以方便地制作出各种人体姿态,并基于关键帧插值方法生成各种人体动画。利用Poser生成人体动作数据文件的步骤如下:

    1)建立人体骨架-外观关联模型

    首先利用3D建模软件Creator生成DI-Guy及Vega所支持的3D虚拟人体模型(·.fit格式),一般只需对DI-Guy原有人体模型进行几何外观及关节DOF节点位置定制处理,以提高系统开发效率。然后利用Poser导入虚拟人体模型,此时只有以三角面片表示的几何外观模型,关节DOF节点信息丢失,因此需要利用Poser 7的Setup Room提供的骨架生成工具进行骨架设计并与几何外观模型绑定(riggjIlg character)。在建立人体骨架时要保证关节个数及位置与Creator中DOF节点相一致,在利用Grouping Tool建立每一骨骼与外观八何模型中三角面片的关联关系时要与Creator中DOF节点下的面片信息相一致,确保Poser环境中人体动作效果与DI-Guy中人体动作的一致。图1为Creator中的虚拟人体3D模型,DOF节点如图中各局部坐标系所示,图2为Poser 7中定制生成的包含虚拟人骨架及外观的figure模型。

Creator环境中虚拟人体3D模型
图1 Creator环境中虚拟人体3D模型

DI-Guy中人体动作生成方法研究
 图2 Poser环境中虚拟人体3D模型

    2)生成关键帧姿态

    Poser中有两种方法可用于控制身体相应关节的姿态,一种是使用编辑工具在文档视图中用鼠标对关节直接进行拖动;另一种是在参数面板中通过对每一个关节的姿态参数输入确定的数值进行调节。两种方法都可直接在文档视图中直观地观察到姿态结果,方便地生成各关键帧骨架姿态。

    3)导出数据文件

    制作出各关键帧姿态后,Poser可自动对关键帧姿态进行插值生成人体动画,此时可直接在Poser文档视图中观察虚拟人动画效果,对于中间某帧不太理想的人体姿态可以再次进行编辑修改,最终生成逼真、流畅的人体动作后,可通过Poser导出工具生成BVH格式的标准动作捕捉数据文件,用于DI-Guy环境下虚拟人动作的实时数据驱动。

    对于已有的BVH动作数据文件,为了保证动作数据与虚拟人模型的匹配,避免模型不匹配所造成的穿插、断裂等现象,可利用Poser的导人工具将原有BVH数据文件导入定制好的3D人体模型,在Poser中观察动作效果并手动调节相应姿态,生成满意的动作效果后,再次将数据文件导出,实现已有运动数据的重定向。

    4 运动捕捉数据在DI-Guy中的应用

    在得到与DI-Guy中虚拟人体模型相匹配的运动捕捉数据文件后,即可在Vega环境下读入数据文件,基于DOF节点实现虚拟人体模型的实时数据驱动,完成应用系统中用户定制动作的添加生成。

    4.1 BVH数据文件读入

    根据BVH数据文件格式,可定义Joint类实现骨架结构及关节旋转角度数据的读入。除根关节外,各关节的数据信息为相对于父关节的姿态角度旋转数值。由于Vega中基于DOF节点实现人体姿态的变形,DOF节点等同于Poser中的关节点,因此在运动数据读入时不需对数据文件进行解析操作,即不需进行从当前节点一直到根节点所有相对变换矩阵的相乘操作,可直接读入旋转角度数值按规定旋转次序赋给DOF节点,程序设计简便,应用系统运行效率几乎不受影响。

    在角度数据读入时每一关节要保存具体的角度旋转次序信息,在程序设计时可通过对Joint类添加一整数成员变量的方法实现,O一1l的具体数值用来代表zxy、zyx等不同的12种关节角度旋转次序信息。

    4.2 虚拟人动作生成

    得到虚拟人体各个关节点旋转角度信息后。即可对DOF节点赋值实现人体姿态的变形并最终生成人体动作效果。在进行DOF节点赋值操作时,要注意DOF节点局部坐标系(oxYz)与Poser中关节坐标系(oxyz)的对应关系,本文在Creator中所定制的虚拟人体所有DOF节点局部坐标系与Poser中关节点局部坐标系的对应关系如图3所示。

    因此DOF节点三个旋转角度与Poser中关节点旋转角度有如下对应关系:

DI-Guy中人体动作生成方法研究
图3坐标系关系图

    Yaw(z)=joint.rotate_angle.Y;
    Pitch(x)=joint.rotate_angle.z;
    Roll(Y)=joint.rotate_angle.x;
   
    但对于上臂关节,还要特别注意Creator中虚拟人体初始姿态与Poser中人体默认初始姿态的对应关系。Poser中默认人体初始姿态为T形,两臂张开,若在Creator中进行人体建模时虚拟人体也为T形,上述角度对应关系不变;若虚拟人体在Creator下为立正姿态,两臂自然下垂,则肩部关节DOF节点需先进行绕x轴90度的旋转变换,此时左肩DOF节点三个旋转角度与Poser下相应关节的角度对应关系变为:

    Yaw(Z)=一joint.rotate_angle.x;
    Pitch(X)=joint.rotate_angle.z+90;
    RoU(Y)=joint.rotate_angle.y;
   
    左肩其余子关节(肘、腕及手部关节)的对应关系为:

    Yaw(Z)=一joint.rotate_angle.x;
    Pitch(X)=joint.rotate_angle.z;
    Roll(Y)=joint.rotate_angle.y;
   
    右肩DOF节点三个旋转角度与Poser下相应关节的角度对应关系为:

    Yaw(Z)=joint.rotate_angle.x;
    Pitch(X)=joint.rotate_angle.z一90;
    Ron(Y)=一joim.rotate_angle.y;
   
    右肩其余子关节(肘、腕及手部关节)的对应关系为:

    Yaw(Z)=joint.rotate_angle.x;
    Pitch(x)=joint.rotate_angle.z;
    Roll(Y)=一joint.rotate_angle.Y;

    在得到各个DOF节点旋转角度信息后,即可在程序中对DOF节点进行旋转变换得到骨架姿态,并通过插值运算生成中间各帧骨架姿态。由于欧拉角不同旋转次序效果不同,此时必须根据运动捕捉数据中关节旋转次序信息进行DOF节点旋转变换,因此不能直接用vgPos(dof,pos)函数实现旋转角度的一次整体赋值,需利用vgMat按次序实现旋转变换。部分程序代码如下:

    vgMat mat;
    vgMatStack·matBtack;
    matstack=vgNewMatStack();
   
    vgObject* soldier=vgFindObj("soldier");
    vgMakeParts(soldier);//找到对应DOF节点:
    vgPart* shoulder 1=vgFindPart(soldier,"shoulder_l",NULL);//找到对应关节点
    Joint* ss=jointroot->LocateJoint("IShldr");//旋转次序信息
    rotationorder=88->rotationorder;
    vgGetPos(shoulder_l,Pos);
    vgGetPosMat(pos,mat);
    vgPushMatStack(matstack);
    vgLoadMat(matstack,mat);
    switch(rotationorder){//0对应关节旋转次序为xzy,则对应DOF节点旋转次序为
   
    YXZ ease 0://DOF节点首先绕y轴旋转
    vgRotMat(matstaek,SS->rotate_angle.X,Y);//DOF节点再绕x轴旋转
    vgRotMat(matstaek,ss->rotate_angle.z,x);//DOF节点最后绕Z轴旋转
    vgRotMat(matstack,SS->rotate_angle.Y,g);
    vgGetMat(matstack,mr);
    vgPopMatStack(matstack);
    vgPosMat(pos,mat);//对自由度节点实现姿态赋值
    vgPos(shoulder_l,pos);
    break;
    case 1://1:对应另一种关节旋转次序xyz
   
    .......

    break;
    }

    对于中间各帧,依据时间点利用函数vgInterpMat()在两个关键帧的旋转矩阵对应元素之间采用线性插值的方法生成旋转矩阵mat。最终生成的虚拟人奔跑、正步走动作场景如图4、图5所示;

DI-Guy中人体动作生成方法研究
图4同一视角下虚拟人奔跑动作场景

DI-Guy中人体动作生成方法研究
图5不同视角下虚拟人正步走动作场景

DI-Guy中人体动作生成方法研究
图6 Dl_Guy商层API函数生成的动作场景

    图6为同一虚拟人模型调用DI-Guy高层API动作函数所生成的瞄准及匍匐前进动作场景。从图4、5可以看出所添加、定制的动作逼真、形象,同时应用系统也可直接调用DI-Guy原有高层动作函数,大大方便了应用系统的开发。

    5结论

    本文利用3D人体动画软件Poser在动作编辑、生成方面的优势,将DI-Guy平台下的人体模型导入Poser中进行3D动作数据生成,依据Poser中人体关节点与Vega开发环境下DOF节点之间的对应关系,既实现了已有运动数据的重定图4同一视角下虚拟人奔跑动作场景图5不同视角下虚拟人正步走动作场景图6 Dl_Guy商层API函数生成的动作场景向,又实现了用户自定义动作的定制牛成。在实际应用中用户不但可以基于DI-Guy高层API函数调用系统已有动作,也可读入动作捕捉数据文件实现自定义动作的添加生成,高效解决了DI-Guy在动作编辑及新动作生成方面的局限,对于类似应用系统的开发具有重要的参考价值。

    参考文献:

    [1] 王乘,等.Vega实时三维视景仿真技术[M].武汉:华中科技大学出版社,2005.

    [2] 马立元,谢建华,张睿.某型导弹虚拟训练系统中虚拟人运动控制的实现[J].计算机工程与应用,2005.11:205-207.

    [3] 壬乘,周均清,李利军.Creator可视化仿真建模技术[M].武汉:华中科技大学出版社,2005.

    [4] 叶洪涛.Poser基础教程[M].北京:清华大学出版社,2005.

    [5] 耿卫东,陈为.计算机游戏程序设计[M].电子工业出版社,2005-3

    [6] 徐孟,孙守迁,潘云鹤.虚拟人运动控制技术的研究[J].系统仿真学报,2003,15(3):338-342.

    [7] 谢建华,等.基于DI-Guy的某型导弹虚拟操作训练环境设计[J].计算机仿真,2005。22(3):66-68.

    [8] 邹震.Poeer4三维动画设计一战神篇[M].北京:国防工业出版社,2004.

    [作者简介]

    李石磊(1980一),男(汉族),河南南阳人,博士研究生,主要研究方向为虚拟现实

    梁加红(1959一),男(汉族),湖南平江人,博士,教授,博士生导师,主要研究方向为复杂系统控制、仿真与测试。

    柏友良(1982一),男(汉族),云南师宗人,硕士研究生,主要研究方向:虚拟现实、训练模拟器。

    陈凌(1978一),男(汉族),湖南宁乡人,博士研究生,主要研究方向:系统仿真、训练模拟器。

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料