(一)BVH文件格式相关:
BVH(Biovision层次模型)是Biovision Hierarchy的缩写,它是由Biovision公司开发的一种描述动作捕获的数据文件格式。这种文件描述的人体动画十分逼真,因为它通过真实的人体模特穿上带有传感器的特殊衣服捕获动画。BVH文件来源也相当广泛,且易于制作,它可以利用3DMAX,POSER等软件制作;此外,这种文件是以文本形式存储的,因此操作简单,容易开发。
从计算机编程角度看来,程序员喜欢将很多东西分开对待,从而简化,也就是分而治之。计算机动画肯定是复杂的,但是总有办法解决,于是动画被分为 蒙皮 & 骨骼动作。
BVH文件存放的就是骨骼的构成和动作数据。BVH是在BVA格式的基础上的改进,在动作捕获后,解析出来的。
BVH文件分为2个主要部分:骨架信息 和 数据块
骨架信息 按照层级关系,定义了如root hip leg等位置和旋转分量,从而形成一个完整的骨架
数据块 对应上面的骨架各部位 标出每帧的数据信息
各种类型的动作捕捉仪导出的BVH文件还是有差别的,对于Xsens惯性动作捕捉仪导出的BVH文件,文件基本的结构,参考:论文Motion Capture File Formats Explained
(二)如何读取并保存运动数据:
上面说过BVH包括两部分:骨架层次信息和每帧运动数据。层次信息保存了每个节点相对其父节点的位置信息,通过这些数据可以构造出骨架的初始姿态。如下图所示:
注意:层次信息中第一行由关键字offset分隔,详细说明关节所在局部坐标系的原点相对于其父关节所在局部坐标系原点的分别沿着x、y和z轴的平移(或根骨骼的全局平移)。
骨架中的各个关节节点相对父节点的位置读取并保存好之后,在渲染的时候,从根节点开始,依次求出每个关节在世界坐标中的位置,即可绘制出正确的骨架结构。
接下来就要读取运动数据了,首先可以从文件中读取出运动的总帧数,然后建立动态数组保存运动数据。运动数据的每帧保存的信息是这个样子的:
根节点的平移量(X、Y、Z)+除了site外所有节点的旋转信息(注意:旋转分量的次序是根据CHANNELS而定,旋转信息使用的是角度值表示的!)
注意:每个关节的局部旋转矩阵R的构造可以通过将每个沿着不同通道轴的旋转矩阵相乘,按照它们在文件的层次结构部分中出现的顺序轻松完成。比如CHANNELS 3 Zrotation Xrotation Yrotation,可以这样计算该关节的旋转矩阵:R = RzRxRy
然后构造该关节的局部转换矩阵:M=TRS
由于bvh格式不包含缩放信息(上式中的S),我们只需要考虑旋转(R)和平移矩阵(T)来构造局部转换。
根关节是唯一具有每帧平移数据的骨骼,但是每个骨骼都有一个需要添加到本地矩阵堆栈的基准偏移量。因此,Tx、Ty和Tz代表骨骼的基本位置和帧平移数据的总和。所以关节的局部转换矩阵最终可以这样子构造:
运动数据块中每一帧的前三个数据就是根节点的根节点的平移量(X、Y、Z),也是相对于初始姿势的。用于计算其他关节的平移矩阵。
每帧的旋转角度值,是相对于骨架的初始姿态的。知道这些后,接下来就是每行的读取帧数据了。
每帧相对初始姿态的数据保存好之后,在渲染时,将每一帧的旋转矩阵取出,乘以初始姿态在世界坐标系的变换矩阵,即可产生动画了。
关于BVH新的理解:
文件的层次结构部分通过各个关节的offset值给出人物初始姿势Tpose,根关节所在的坐标系与世界坐标系的朝向是相同的。所有的子关节的偏移量offset 都是 在父关节所在的局部坐标系中 子关节所在局部坐标系的原点的位置(也就是子关节的位置),因为子关节的偏移是相对于父关节局部坐标系的。根关节所在的局部坐标系,以及所有的关节所在的局部坐标系的朝向都与世界坐标系的朝向一致,这样才能画出Tpose