BVH文件解析

2010-05-14

最近在做计算机动画方面的研究,读取BVH动作文件,从网上找了一些资料,介绍的不全,而且只是简单的介绍了BVH文件的结构,并没有看到BVH文件中每帧数据代表的真正含义。于是乎,自己摸索了许久,终于得到了正确的运动效果。

1、首先介绍一下BVH文件的基本概念,网上这方面的资料还是很多的,我进行了一些总结:

BVH(Biovision层次模型)是Biovision Hierarchy的缩写,它是由Biovision公司开发的一种描述动作捕获的数据文件格式。这种文件描述的人体动画十分逼真,因为它通过真实的人体模特穿上带有传感器的特殊衣服捕获动画。BVH文件来源也相当广泛,且易于制作,它可以利用3DMAX,POSER等软件制作;此外,这种文件是以文本形式存储的,因此操作简单,容易开发。

从计算机编程角度看来,程序员喜欢将很多东西分开对待,从而简化,也就是分而治之。
计算机动画肯定是复杂的,但是总有办法解决,于是动画被分为 蒙皮 & 骨骼动作
bvh文件存放的就是骨骼的构成和动作数据————
BVH是在BVA格式的基础上的改进,在动作捕获后,解析出来的
BVH文件分为2个主要部分:骨架信息 和 数据块
骨架信息 按照层级关系,定义了如root hip leg等位置和旋转分量,从而形成一个完整的骨架
数据块     对应上面的骨架各部位 标出每帧的数据信息

各种类型的动作捕捉仪导出的BVH文件还是有差别的,我是用的是Xsens惯性动作捕捉仪导出的BVH文件。文件基本的结构如下所示:

HIERARCHY
ROOT Hips
{
OFFSET 0.000000 0.000000 0.000000
CHANNELS 6 Xposition Yposition Zposition Yrotation Xrotation Zrotation
JOINT Chest
{
  OFFSET 0.000000 9.085309 -0.011154
  CHANNELS 3 Yrotation Xrotation Zrotation
  JOINT Chest2
  {
   OFFSET 0.000000 8.950749 0.022763
   CHANNELS 3 Yrotation Xrotation Zrotation
   JOINT Chest3
   {
    OFFSET 0.000000 8.911174 0.000000
    CHANNELS 3 Yrotation Xrotation Zrotation
    JOINT Chest4
    {
     OFFSET 0.000000 8.902070 0.000000
     CHANNELS 3 Yrotation Xrotation Zrotation
     JOINT Neck
     {
      OFFSET 0.000000 13.422772 0.000000
      CHANNELS 3 Yrotation Xrotation Zrotation
      JOINT Head
      {
       OFFSET 0.000000 8.338636 0.048151
       CHANNELS 3 Yrotation Xrotation Zrotation
       End Site
       {
        OFFSET 0.000000 15.778614 0.025430
       }
      }
     }
     JOINT RightCollar
     {
      OFFSET -2.767708 8.920939 0.000000
      CHANNELS 3 Yrotation Xrotation Zrotation
      JOINT RightShoulder
      {
       OFFSET -13.358980 0.000000 0.000000
       CHANNELS 3 Yrotation Xrotation Zrotation
       JOINT RightElbow
       {
        OFFSET 0.000000 -29.360726 0.000000
        CHANNELS 3 Yrotation Xrotation Zrotation
        JOINT RightWrist
        {
         OFFSET 0.000000 -23.728381 0.000000
         CHANNELS 3 Yrotation Xrotation Zrotation
         End Site
         {
          OFFSET 0.000000 -17.517202 0.000000
         }
        }
       }
      }
     }
     JOINT LeftCollar
     {
      OFFSET 2.767708 8.920939 0.000000
      CHANNELS 3 Yrotation Xrotation Zrotation
      JOINT LeftShoulder
      {
       OFFSET 13.358980 0.000000 0.000000
       CHANNELS 3 Yrotation Xrotation Zrotation
       JOINT LeftElbow
       {
        OFFSET 0.000000 -29.360726 0.000000
        CHANNELS 3 Yrotation Xrotation Zrotation
        JOINT LeftWrist
        {
         OFFSET 0.000000 -23.728381 0.000000
         CHANNELS 3 Yrotation Xrotation Zrotation
         End Site
         {
          OFFSET 0.000000 -17.517202 0.000000
         }
        }
       }
      }
     }
    }
   }
  }
}
JOINT RightHip
{
  OFFSET -7.475494 0.055214 0.005577
  CHANNELS 3 Yrotation Xrotation Zrotation
  JOINT RightKnee
  {
   OFFSET 0.000000 -38.197352 -0.005333
   CHANNELS 3 Yrotation Xrotation Zrotation
   JOINT RightAnkle
   {
    OFFSET 0.000000 -37.100850 -0.009018
    CHANNELS 3 Yrotation Xrotation Zrotation
    JOINT RightToe
    {
     OFFSET 0.000000 -9.655660 22.225547
     CHANNELS 3 Yrotation Xrotation Zrotation
     End Site
     {
      OFFSET 0.000000 -1.495764 7.116721
     }
    }
   }
  }
}
JOINT LeftHip
{
  OFFSET 7.475494 0.055214 0.005577
  CHANNELS 3 Yrotation Xrotation Zrotation
  JOINT LeftKnee
  {
   OFFSET 0.000000 -38.197352 -0.005333
   CHANNELS 3 Yrotation Xrotation Zrotation
   JOINT LeftAnkle
   {
    OFFSET 0.000000 -37.100850 -0.009018
    CHANNELS 3 Yrotation Xrotation Zrotation
    JOINT LeftToe
    {
     OFFSET 0.000000 -9.655660 22.225547
     CHANNELS 3 Yrotation Xrotation Zrotation
     End Site
     {
      OFFSET 0.000000 -1.495764 7.116721
     }
    }
   }
  }
}
}
MOTION
Frames: 1
Frame Time: 0.008333
0.000000 84.730760 0.000000 0.000000 -5.767889 0.000000 0.000000 11.653876 0.000000 0.000000 -5.885988 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 12.528808 0.000000 0.000000 0.711711 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 -90.000000 0.000000 -2.309063 0.000000 0.000000 2.309063 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 90.000000 0.000000 -2.309063 0.000000 0.000000 2.309063 0.000000 0.000000 8.520374 0.000000 0.000000 1.905768 0.000000 -0.000000 -4.658254 0.000000 0.000000 -0.000000 0.000000 0.000000 8.520374 0.000000 0.000000 1.905768 0.000000 -0.000000 -4.658254 0.000000 0.000000 -0.000000 0.000000

....

2、下面介绍如何读取并保存运动数据:

上面说过BVH包括两部分:骨架层次信息和每帧运动数据。层次信息保存了每个节点相对其父节点的位置信息,通过这些数据可以构造出骨架的初始姿态。如下图所示:

我是使用DirectX来绘制图形的,DX使用的左手坐标系,而BVH文件中使用的是右手坐标系,所以在绘制图形的时候,需要将得到的数据坐标系转换成左手坐标系。这里需要将层次信息中的z轴数据取反赋给DX中的z即可,x、y不变。

骨架中的各个关节节点相对父节点的位置读取并保存好之后,在渲染的时候,从根节点开始,依次求出每个关节在世界坐标中的位置,即可绘制出正确的骨架结构。

接下来就要读取运动数据了,首先可以从文件中读取出运动的总帧数,然后建立动态数组保存运动数据。运动数据的每帧保存的信息是这个样子的:

根节点的平移量(X、Y、Z)+除了site外所有节点的旋转信息(注意:旋转分量的次序是根据CHANNELS而定,旋转信息使用的是角度值表示的!)

每帧的旋转角度值,是相对于骨架的初始姿态的。知道这些后,接下来就是每行的读取帧数据了。代码如下:

  

  1. vec.y = atof(words.at(j+6).c_str()); 
  2. vec.x = atof(words.at(j+7).c_str()); 
  3. vec.z = atof(words.at(j+8).c_str()); 
  4.  
  5. D3DXMATRIX matRotate; 
  6. D3DXMatrixIdentity(&matRotate); 
  7. D3DXMATRIX matY; 
  8. D3DXMatrixIdentity(&matY); 
  9. D3DXMatrixRotationY(&matY, -vec.y*3.14f/180.0f); 
  10. D3DXMATRIX matX; 
  11. D3DXMatrixIdentity(&matX); 
  12. D3DXMatrixRotationX(&matX, -vec.x*3.14f/180.0f); 
  13. D3DXMATRIX matZ; 
  14. D3DXMatrixIdentity(&matZ); 
  15. D3DXMatrixRotationZ(&matZ, vec.z*3.14f/180.0f);   
  16. D3DXMatrixMultiply(&matRotate, &matZ, &matX); 
  17. D3DXMatrixMultiply(&matRotate, &matRotate, &matY); 

 

每帧相对初始姿态的数据保存好之后,在渲染时,将每一帧的旋转矩阵取出,乘以初始姿态在世界坐标系的变换矩阵,即可产生动画了

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity是一款流行的游戏引擎,支持多种文件格式的导入,其中包括bvh文件格式。bvh文件格式是一种用于记录人体骨骼动作的文件格式,通常用于动画制作。 在Unity中导入bvh文件非常简单。首先,在Unity中创建一个新项目,并导入需要的人体模型。其次,打开导入人物模型的编辑器,在编辑器中选择导入bvh文件的选项。接下来,选择需要导入的bvh文件,并按照提示完成导入过程。在导入过程中,Unity会自动将bvh文件中的骨骼动作信息应用到导入的人体模型上。 在导入完毕后,可以使用Unity的动画编辑器来查看和编辑导入的骨骼动作。除了默认的动画编辑器,还可以使用一些第三方插件来更好地控制和编辑动画。此外,如果觉得需要,还可以利用Unity"动作匹配器"和"动作融合器"的功能,来组合和混合多个动画。 总之,Unity支持bvh文件的导入,使得人物动画制作变得更加容易和高效。通过导入和编辑bvh文件,人物动画制作者可以创造出更加生动、精彩的人物动作,从而提高游戏的质量和用户体验。 ### 回答2: Unity是一款非常强大的游戏引擎,可以实现3D场景的构建和游戏物体的操作。而导入bvh文件也是其中的一个非常重要的功能,这可以非常方便地实现角色动作的导入和应用。 首先,在Unity的资源管理器中选择需要导入bvh文件的对象,在其属性面板中选择“导入”的选项。随后选择bvh文件,并进行导入操作。 接下来,在导入后的动画对象上,我们可以进行各种不同的操作,比如修改动画的播放速度、添加新的动画片段、或者对动画进行差值和编辑。 需要注意的是,在导入bvh文件时,Unity会尝试将其重新调整为匹配当前场景的大小和比例。因此,有时候可能需要手动对动画进行一些微调和编辑,以实现最佳效果。 总之,使用Unity导入bvh文件是一项非常重要且实用的功能,可以让我们更加轻松和高效地创建精美的动画效果。 \end{cn} ### 回答3: Unity是一款流行的游戏引擎,可以用于开发各种类型的游戏。导入BVH文件是Unity中常见的任务,这种文件格式通常用于描述人体运动数据。以下是关于如何在Unity中导入BVH文件的一些提示。 首先,Unity可以通过使用第三方插件来导入BVH文件。有许多免费或付费的插件可供选择,例如"BVH Importer"或"FinalIK"。在查找和选择插件之前,要确保已经下载并安装了最新的Unity版本。 安装插件后,需要准备BVH文件。可以使用3D建模软件如Maya、Blender或MotionBuilder来创建或修改此文件。通常需要确保文件符合常见的BVH标准格式,例如正确的帧速率、帧数量、层次结构和骨骼命名。 导入过程与导入其他文件类型相似: 打开Unity,创建一个新项目或打开现有项目,然后从文件选项中选择导入功能。选择正确的插件和BVH文件后,将需要进行一些设置,例如指定是否移动,旋转或缩放人物模型。 成功导入BVH文件后,Unity会生成一个包含BVH数据的动画片段。可以通过将这段动画片段附加到人物模型上,使模型运动引擎和动画数据配合工作。 总之,在Unity中导入BVH文件需要使用适当的插件,并通过创建和配置人物模型来准备文件。成功导入后,BVH数据可用于实现复杂的人体动作和其他交互式游戏元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值