您的位置:首页 > 其它

基于BVH驱动的OGRE骨骼动画

2013-08-11 01:02 204 查看
摘要:OGRE游戏引擎中的角色动画将模型与骨骼文件进行映射。若想在不借助第三方建模软件重新制作模型和动画的基础上更改现有模型的动作,获取与模型匹配的骨骼数据成为一个难题。提出了一种将标准BVH动作文件解析为XML文件的方法,生成与OGRE模型匹配的骨骼文件,将来源广泛的BVH文件作为动作数据,极大地丰富了OGRE角色动画。实验结果证明,转换后的BVH可以与OGRE中的模型融合起来,从而驱动模型。 
  关键词:BVH文件; 可扩展标记语言文件; 骨骼动画;
OGRE游戏引擎 
  中图分类号:TP391文献标志码:A 
  文章编号:1001-3695(2009)09-3550-03 
  doi:10.3969/j.issn.1001-3695.2009.09.101 
   
  Driving OGRE skeleton animation based on BVH 
  GUO Lia,
HE Ming-yunb, CHEN Lei-tingb 
  (a. School of Software, b. Shool of Computer Science & Engineering, University of Electronic Science & Technology of China,
Chengdu 610054, China) 
  Abstract:Animation of the role mapped the module and skeleton file in OGRE game engine. It is so hard to restructure the existing
animation of the role and acquire the skeleton matched the module without using third-party modeling software to recreate module
and animation. This paper presented a method which parsed standard BVH file to XML file, created skeleton file matched OGRE module, by using BVH file which had wide range of source as the animation data, significantly enriched the OGRE animation of the role.
The result of the experiment proves that the converted BVH can combine perfectly with OGRE,and drive the model. 
  Key words:BVH file; XML file; skeleton animation; OGRE game engine 
   
  0 引言 
   
  OGRE作为目前流行的游戏引擎,为使用者提供了丰富的功能,但模型、动画数据的重用性却不高。如果想在现有的模型中改变模型中的动作,就需要在骨骼文件中增加新的动作。传统的做法是借助第三方的建模软件重新制作模型,或是制作动画,再经插件导成OGRE支持的格式,过程比较繁琐。本文提出一种文件转换方法,直接运用BVH动作文件将其导入到引擎中,用于驱动模型。 
   
  1 BVH文件和OGRE引擎介绍 
   
  1.1 BVH文件简介 
  BVH是BioVision运动捕获文件格式的文件扩展名。BVH文件[1]包含角色的骨骼和肢体关节旋转数据。BVH是一种通用的人体特征动画文件格式,广泛地被当今流行的各种动画制作软件(Poser、3DS
Max等)支持。通常可从记录人类行为运动的运动捕获硬件获得。 
  1.2 BVH文件层次结构 
  BVH文件的第一部分以图1的方式描述人体的骨骼模型,通过树结构来实现。 
  图1中用节点表示关节,连线表示驱干,身体的各个部分形成了子树的形式。BVH文件的第一部分定义了关节树和每个关节点的名称、通道数目、关节与关节之间的相对位置,即定义了人体各部分的骨骼长度。由于人体存在的差异,可以通过改变相对位置的数值来区别不同年龄、不同身材比例的人。对于每一个关节,都有三个旋转参数(相对于X、Y、Z轴的旋转角度)来描述运动信息。Hip关节点作为整个人体的根关节点还含有三维空间位置参数,从而完成了对人体的完整描述。 
  1.3 BVH文件运动数据 
  BVH文件的第二部分记录了运动的数据,定义了动作数据持续的长度(即帧数)以及每帧之间的时间间隔。按照第一部分定义的关节顺序提供每帧数据,记录了每一帧中各个关节节点的位置信息和旋转信息。 
  1.4 OGRE骨骼动画简介 
  骨骼动画是根据网格数据中的骨骼信息来产生动画效果。在使用骨骼动画的时候,模型中的顶点数据被绑定到由多块骨头组成的骨骼上。骨骼动画是通过表示骨头的一个矩阵来影响所绑定顶点的位置而实现的。 
  在OGRE中,骨骼被定义为一个类似多叉树一样的父子结构。一个骨骼中所有的骨头都会有连接到上一级骨头,如同树枝一样,最终连接到根部(称之为根骨头)。根骨头没有父节点;骨头的运动会传递到所有下一级的骨头,然后依次传递。在空间变换的领域中,骨骼中的骨头和场景中的节点有着相同的情况:改变任何一个骨头都会影响所有子骨头的状态。 
  骨骼和动画信息被保存在以.skeleton结尾的文件中。当创建一个基于某个mesh的实体时间,如果mesh上有动画信息,那么相应的skeleton会自动被加载。 
   
  2 BVH文件解析器系统模型分析 
   
  BVH文件解析器通过令牌传递的方式,逐步读取BVH文件中的每一个关键词、整型字符、浮点型字符、字符串。系统模型如图2所示。解析完成后,填充骨骼数据结构和运动数据结构,并完成关节节点位置和方向数据的插值。 
  2.1 骨骼段数据结构 
  数据结构Joint存放BVH中描述每一个关节点的信息,其中包括关节点的名称、父关节点、子节点个数、子节点、节点世界坐标系中的位置、从父节点中继承而来的位置偏移量、从父节点继承而来的旋转偏移量。通过判断节点是否有子节点,采用递归调用解析所有的节点,形成如图1所示的关节节点树。位置偏移量和旋转偏移量记录的是节点的关键帧信息,此后将会对关键帧进行插值,以形成平滑的运动轨迹。 
  Joint 
  { 
   string name; 
   Joint* parent; 
  int n_children; 
  Joint** child; 
   vector world_position; 
   vector rest_position; 
   quaternion rest_rotation; 
  } 
  2.2 运动数据段数据结构 
  运动数据可拆分为位移数据、旋转数据、由运动捕捉器捕获而来的运动数据信息。位移数据包括位移偏移量对应的关节点名称、在捕获到的运动数据中的索引号。旋转数据包括旋转偏移量对应的关节点名称,在捕获到的运动数据中的索引号。运动数据信息包括动作的名称、动作持续的时间、位移数据、旋转数据以及位移数据和旋转数据的个数。

 TranslationalTriDOF 
   { 
  string name; 
  int n_samples; 
   } 
   RotationTriDOF 
   { 
   string name; 
   int n_samples; 
   } 
   RecordedMotion 
  { 
   string name; 
   double duration; 
   TranslationalTriDOF ** transdof; 
   RotationTriDOF** rotdof; 
  int n_tridofs; 
  } 
  2.3 插值处理 
  在BVH的运动数据部分只是每一个关键帧信息,欲平滑地表现运动过程需要通过关键帧进行插值处理。本文通过对Joint数据结构中的位置偏移量进行向量的线性插值,对旋转偏移量进行四元数的球面线性插值[4]如图3所示,从而生成平滑的运动轨迹。 
  设q为一个四元数,其记法记为 
  q=[cos(θ/2)(sinθ/2)n] 
  vt=k0v0+k1v1,sinω=sin tω/k1 
  k1=sin tω/sinω,k0=sin(1-t)ω/sin ω 
  vt=(sin
(1-t)ω/sin ω)q0+(sin tω/sin ω)q1 
  slerp(q0,q1,t)=(sin
(1-t)ω/sin ω)q0+(sin tω/sinω)q1 
   
  3 OGRE骨骼文件解析器系统模型分析 
   
  3.1 OGRE骨骼文件的XM
L文件格式 
  为将BVH文件应用到OGRE中,本文提出的一种方法是将BVH转换为标准XML格式,再利用OGRE自身的XML导入插件即可顺利地将BVH文件转换为游戏引擎自身支持的骨骼文件。 
   OGRE骨骼文件的XML格式如下所示: 
  〈skeleton〉 
  〈bones〉 
  〈bone_id〉=″″ name=″″〉 
  〈posotion x=″″ y=″″ z=″″ /〉 
  〈rotation〉 
  〈axis x=″″ y=″″ z=″″ /〉 
  〈/rotation〉 
  〈/bone〉 
  〈/bones〉 
  〈bonehierarchy〉 
  〈boneparent bone=″″ praent=″″ /〉 
  〈/bonehierarchy〉 
  〈anumations〉 
  〈animation name=″″ length=″″〉 
  〈tracks〉 
  〈track bone=″″〉 
  〈keyframes〉 
  〈keyframe time=″″〉 
  〈rotate angle=″″〉 
  〈axis x=″″ y=″″ z=″″ /〉 
  〈/rotate〉 
  〈scale x=″″y=″″ z=″″ /〉 
  〈translate x=″″ y=″″ z=″″ /〉 
  〈/keyframe〉 
  〈/keyframes〉 
  〈/track〉 
  〈/tracks〉 
  〈/animation〉 
  〈/animations〉 
  〈/skeleton〉 
  其中:〈bones〉标签段对应从BVH中解析出的每一个关节点的名称、相对父节点的位移偏移量、旋转偏移量、相对于父节点的方向;〈bonehierarchy〉标签段指明骨骼层次关系;〈animations〉标签段对应从BVH中解析出的运动数据信息;〈animation〉标签段指出动作的名称、长度;〈tracks〉标签段用于创建OGRE中的动画轨迹,其中的〈keyframes〉标签段对应BVH文件中的关键帧数据信息,表明旋转角度、旋转轴(即将四元数重新拆分成以轴—角对形式进行表示)、缩放比例以及关节的位移。 
  3.2 BVH数据转换至XML 
  本文在实现上借助TinyXML函数库进行XML文件的读写操作。通过第2章实现的BVH文件解析器得到的数据,对XML文件的各个标签进行数据填充。通过判断每一个关节节点的n_children属性值来进行多层递归调用。程序流程图如图4所示。 
   
  4 实验结果 
   
  该文件转换系统以MFC为框架,DirectX
9.0为图形开发包,在VC++
7.0编辑环境调试运行,效果如图5所示。图5的左侧显示了BVH文件的骨骼层次信息,右侧演示了第一帧和第二帧的运动姿态,中间为插值结果。通过转换器将walk.bvh转换成walk.skeleton.xml后,利用OGRE自带的XMLConvertor插件即可将walk.skeleton.xml转换为walk.skeleton文件。图6为将walk.skeleton骨骼文件应用在jaiqua.mesh上的结果(在CeguiMeshViewer查看器中验证)。 
   
  5 结束语 
   
  本文所实现的文件转换系统经验证能够正确驱动OGRE中的模型,使得动作来源更容易,也使得模型的动作更加丰富。进一步的工作将考虑多个动作的融合[2,3],通过不同的融合算法产生大量新的动作,形成一系列的动作库供模型使用。另外在模型方面,可以在OGRE引擎的基础上完成人物换装系统,并将模型和声音文件相结合。 
   
  参考文献: 
  [1]朱强,庄越挺,潘云鹤. 基于紧身衣的人体动画研究[J].软件学报,2002,
13(4):601-607. 
  [2]LIU C K, HERTZMANN A, POPOVIC Z.Learning physics-based motion styles with inverse optimization [J]. Computer Graphics 2005,
24(3):1071-1081. 
  [3]ZORDAN V B, MAJKOWSKA A, CHIU B, et
al. Dynamic response for motion capture animation [J].Computer Graphics, 2005, 24(3):697-701. 
  [4]DUNN F, PARBERRY L. 3D math primer for graphics and game development[M]. [S.l.]:Wordware Publishing Inc, 2002.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: