| 查看: 5822 | 回复: 2 | |||
kelehot金虫 (小有名气)
|
[交流]
BVH文件格式解析已有1人参与
|
|
http://blog.csdn.net/wangyupei/article/details/5591011 最近在做计算机动画方面的研究,读取BVH动作文件,从网上找了一些资料,介绍的不全,而且只是简单的介绍了BVH文件的结构,并没有看到BVH文件中每帧数据代表的真正含义。于是乎,自己摸索了许久,终于得到了正确的运动效果。 1、首先介绍一下BVH文件的基本概念,网上这方面的资料还是很多的,我进行了一些总结: BVH(Biovision层次模型)是Biovision Hierarchy的缩写,它是由Biovision公司开发的一种描述动作捕获的数据文件格式。这种文件描述的人体动画十分逼真,因为它通过真实的人体模特穿上带有传感器的特殊衣服捕获动画。BVH文件来源也相当广泛,且易于制作,它可以利用3DMAX,POSER等软件制作;此外,这种文件是以文本形式存储的,因此操作简单,容易开发。 从计算机编程角度看来,程序员喜欢将很多东西分开对待,从而简化,也就是分而治之。 计算机动画肯定是复杂的,但是总有办法解决,于是动画被分为 蒙皮 & 骨骼动作 bvh文件存放的就是骨骼的构成和动作数据———— BVH是在BVA格式的基础上的改进,在动作捕获后,解析出来的 BVH文件分为2个主要部分:骨架信息 和 数据块 骨架信息 按照层级关系,定义了如root hip leg等位置和旋转分量,从而形成一个完整的骨架 数据块 对应上面的骨架各部位 标出每帧的数据信息 首先来看看什么叫BVH:Biovision hierarchical data,它是在BVA格式的基础上的改进,在动作捕获后,解析出来的。 BVH文件分为2个主要部分:骨架信息和数据块。 骨架信息 按照层级关系,定义了root hip leg等位置和旋转分量,从而形成一个完整的骨架 数据块 对应上面的骨架各部位,标出每帧的数据信息. BVH的骨架信息是以关键字‘HIERARCHY’开头的,紧跟着'ROOT'表示一个根结点,然后是根结点以下的关节'JOINT',然后逐级向下,递归定义父关节以下的子关节。'OFFSET'表示的是子关节相对于父关节的偏移,也可表示对应父关节的长度和方向;当子关节不止一个时,采用第一个子关节的数据。接下来是'CHANNELS',给出了关于channel的个数和名称。很容易发现ROOT总是拥有6个channels,而一般的JOINT只有3个,较之ROOT缺少了XYZ的position信息。这很好解释,因为子关节只需要根据它相对于父关节的偏移就可以算出它在坐标系中的具体位置了。 需要注意的是,rotation channel的顺序是:Zrotation Xrotation Yrotation。BVH格式的运动采取的旋转方式比较特别,在解析的过程中要小心。'End Site'表示终结递归,该关节的定义到此为止,可看作一个终端效应器。 数据块以'MOTION'关键字开始,'Frames:' 定义帧数,'Frame Time:'定义数据采样速率-每帧的时间长度,如0.033333则表示BVH文件的一般采样速率,每秒30帧。接下来就是实际的运动数据了,对应骨架信息的层次结构。对于子关节来说,平移信息存储在骨架信息的OFFSET中,旋转信息则来自于MOTION部分;对于根结点来说,平移量是OFFSET和Motion section中定义的平移量之和。BVH不考虑Scale变换。 各种类型的动作捕捉仪导出的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而定,旋转信息使用的是角度值表示的!) 每帧的旋转角度值,是相对于骨架的初始姿态的。知道这些后,接下来就是每行的读取帧数据了。代码如下: [cpp] view plaincopy 01.vec.y = atof(words.at(j+6).c_str()); 02.vec.x = atof(words.at(j+7).c_str()); 03.vec.z = atof(words.at(j+8).c_str()); 04. 05.D3DXMATRIX matRotate; 06.D3DXMatrixIdentity(&matRotate); 07.D3DXMATRIX matY; 08.D3DXMatrixIdentity(&matY); 09.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); 每帧相对初始姿态的数据保存好之后,在渲染时,将每一帧的旋转矩阵取出,乘以初始姿态在世界坐标系的变换矩阵,即可产生动画了··· |
» 猜你喜欢
请问有没有不用做仿真就可可发表的机械中文核心期刊?
已经有4人回复
双相钢中利用Genus_3D观察到的三维微观结构与 GAN 算法生成的三维微观结构的对比研究
已经有0人回复
金属材料论文润色/翻译怎么收费?
已经有168人回复
利用高温共聚焦显微镜原位观察中锰钢的包晶凝固过程
已经有0人回复
【26年入学】计算机视觉/电子信息/诚招博士生 光电教育部重点实验室
已经有2人回复
使用高温共聚焦原位观察管线钢的凝固过程
已经有0人回复
请大家帮忙看下,这样的审稿状态是否凶多吉少?
已经有12人回复
【26年入学】红外半导体/电子信息/嵌入式视觉/诚招博士生 光电教育部重点实验室
已经有0人回复
三维重构研究预裂纹的存在和结晶组织对高强度钢脆性破坏的影响
已经有0人回复
CSC难上岸,25年东京大学,早稻田,京都大学多Lab大量招募日本全奖博士生!
已经有2人回复
【26年入学】红外半导体/电子信息/嵌入式视觉/诚招博士生 光电教育部重点实验室
已经有0人回复

2楼2016-01-12 16:58:53
kelehot
金虫 (小有名气)
- 应助: 2 (幼儿园)
- 金币: 1144.3
- 散金: 12
- 红花: 3
- 帖子: 107
- 在线: 27.3小时
- 虫号: 1989727
- 注册: 2012-09-10
- 性别: GG
- 专业: 机构学与机器人

3楼2016-12-04 20:04:51













回复此楼