简介
BVH是BioVision等设备对人体运动进行捕获后产生文件格式的文件扩展名。
BVH文件包含角色的骨骼和肢体关节旋转数据。BVH 是一种通用的人体特征动画文件格式,广泛地被当今流行的各种动画制作软件支持,如3DMax。
文件格式
文件主要部分
骨架信息 和 数据块
- 骨架信息:按照层次关系,定义了如
root
、hip
、leg
等位置和旋转分量,从而形成一个完整的骨架 - 数据块:对应上面的骨架各部位标出每帧的数据信息
一个BVH文件包含两部分,头部部分和数据部分,头部部分描述了骨架的层次关系和初始姿势,数据部分包含了动作(motion)的数据.
文件示例
可以参考文件示例
1 | HIERARCHY |
头部部分
- 头部部分开头包含”HIERARCHY“关键词
- 接着一行开头为”ROOT”关键词,后面跟着root的名字.当然,一个root段(segment)之后,允许再定义另一个段,也可以定义为”ROOT”.原理上,BVH文件能够包含任何数量的骨架段.
- BVH文件的格式为递归的格式,层次结构的每一个segment包含了一些相关数据,该segment要递归定义它的子segment.
- 关键词”ROOT“后以大括号开头,下行以tab填充,能够增加可读性.
- segment的第一个信息是该segment相对于父segment的偏移量(OFFSET), 如果是根ROOT segment则偏移量OFFSET则通常为0,OFFSET指定了X,Y,Z方向上与父segment的偏移量,偏移量也指示用于绘制父segment的长度和方向.
- BVH文件中没有明确的信息能够描述一个segment该怎样画,通常通过从第一个segment的偏移量来定义父segment,典型的,只有ROOT和上部主体的segment将有多个子segment.
- 接下来一是”CHANNEL“头部信息,后面跟着的数字表明channels的数目,后面的标签表明每一个channel的类型.
- 一个BVH文件解析器必须跟踪channel的数目和channel的类型,在后面MOTION信息被解析的时候,这个顺序在解析每一行的MOTION数据的时候需要用到.这种格式规定很明显具有灵活性,能够允许segment拥有任何数目的channel,且能够按照任何顺序.
- channel旋转的次序是:Z X Y,
- 接下来能看到”JOINT“和”END SITE“关键词,一个JOINT的定义和ROOT的定义是相同的,除了CHANNEL的数目不同,JOINT正是递归开始的地方,剩下部分对JOINT的解析和ROOT一样的.
- END SITE结束了递归,它的定义还包含了一些数据,它提供了前segment的长度,就像前面子segment提供了offset用于绘制父segment的长度和方向
- JOINT的结尾以右括号结束,BVH中,空间被定义成了右旋坐标系与Y轴作为世界矢量.
数据部分
- 数据部分以MOTION开头,后面的数字表示了帧率,下一行Frame Time定义了采样频率
- 文件剩余的部分包含了motion的数据,每一行是一个motion数据的样本, The numbers appear in the order of the channel specifications as the skeleton hierarchy was parsed.
关键词
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变换。
数据
计算segment的位置,需要从局部的平移和旋转信息创建一个变换矩阵.对于任何joint,平移的信息将会是层次部分中定义的offset,旋转信息则从motion部分得到
对于根ROOT,平移数据为offset的总和,而旋转的消息来自motion部分,BVH不需要考虑比例因子的计算.
创建变换矩阵的直接方法是创建3个单独的旋转矩阵,每个矩阵对应每根轴 vR = vYXZ
解析器
可以参考:BVH java解析器
参考
文章转载自 BVH文件格式解析