BVH文件和骨骼动画

BVH 是一种通用的人体骨骼动画文件格式,基于人体关节(Joint)的树状结构进行存储。

BVH 文件介绍

这里的 BVH 并非 Bounding Volume Hierarchy 的缩写,而是 Biovision Hierarchy 的缩写, Biovision 是一家动捕公司。

BVH 文件分为 Hierarchy 和 Motion 两部分, Hierarchy 部分描述人体关节的树形结构,Motion 部分记录每一帧虚拟角色运动的姿态。下面是一个标准的 BVH 文件。

HIERARCHY
ROOT RootJoint
{
    OFFSET   0.000000   0.000000   0.000000
    CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation
    JOINT lHip
    {
        OFFSET   0.100000  -0.051395   0.000000
        CHANNELS 3 Xrotation Yrotation Zrotation
        JOINT lKnee
        {
            OFFSET   0.000000  -0.410000   0.000000
            CHANNELS 3 Xrotation Yrotation Zrotation
            JOINT lAnkle
            {
                OFFSET   0.000000  -0.390000   0.000000
                CHANNELS 3 Xrotation Yrotation Zrotation
                JOINT lToeJoint
                {
                    OFFSET   0.000000  -0.050000   0.130000
                    CHANNELS 3 Xrotation Yrotation Zrotation
                    End Site
                    {
                        OFFSET   0.010000   0.002000   0.060000
                    }
                }
            }
        }
    }
    ...
}
MOTION
Frames: 2
Frame Time:   0.016667
-0.001735   0.855388   0.315499   2.008551   7.606260  -0.798294  11.216058  -3.286777  -1.592436  13.521250  -1.153514  -4.213484 -17.754157  -3.216621   9.232892  -7.948705   0.211932  -1.528529   2.220789  -0.981058  -1.133630   2.071938  -6.311876   2.083844   2.020309  -0.533885 -19.342332  -5.129554 -37.575293 -50.190804   0.198025 -24.741038   4.442069   0.442380   2.547494   4.858004   1.951773  -5.809334  21.100535  23.710456  30.003467  53.240376   0.414981  10.414544   1.952633   3.576914  -9.482057   6.918939   1.457480  -0.035296   0.111891 -27.722826  -1.655032   2.430426  -2.964232  -5.507982   1.444119   2.239212  -3.180259  -0.892285  -0.008100  -0.007000   0.024400
-0.003810   0.853981   0.337002   2.017405   7.825929  -1.809751  11.713970  -2.355625   0.062023  15.198954  -1.861308  -4.389417 -17.189762  -3.614663   9.244711  -9.397213   0.262158  -1.565413   2.647300  -1.021514   0.131973   1.458470  -6.632789   1.868957   1.928817  -0.148344 -19.543616  -3.937845 -37.139413 -49.957499   0.204371 -24.672734   4.317351   0.916151   2.440320   4.849158   2.068848  -5.518149  21.184327  23.795785  30.805519  52.865110   0.417817  10.118764   1.952408   3.104611  -9.774695   7.021717   1.448893  -0.004226   0.069402 -27.594885  -2.728812   3.499348  -1.670271  -5.527619   1.835016   6.676684  -3.330738  -4.015991  -0.008600  -0.007000   0.026400

Hierarchy 部分

Hierarchy 描述了骨骼的树形结构,比如 rKnee 是一个关节(Joint):

JOINT rKnee
{
	OFFSET   0.000000  -0.410000   0.000000
	CHANNELS 3 Xrotation Yrotation Zrotation
	JOINT rAnkle
	{
   		...
	}
}
  • OFFSET - 当前结点相对于父结点的相对位置;
  • CHANNELS - 表示欧拉角的旋转顺序;
  • JOINT - 表示子节点,可能有多个。

RootJoint 是一个根节点(Root):

ROOT RootJoint
{
    OFFSET   0.000000   0.000000   0.000000
    CHANNELS 6 Xposition Yposition Zposition Xrotation Yrotation Zrotation
    JOINT lHip
    {
    	...
    }
}

ROOT 与 JOINT 的不同之处在于 CHANNELS 属性有6个维度,前三维是该骨骼对应的 X, Y, Z 三个轴的顺序。一般来说,根节点的 OFFSET 为 (0, 0, 0) 。

END Site 是骨骼的末端,即骨骼树的叶子结点。

End Site
{
	OFFSET  -0.010000   0.002000   0.060000
}

显然,只需要 OFFSET 即可表示。

Motion 部分

Motion 部分有以下信息:

  1. Frames 表示接下来动画中帧的数量;

  2. Frame Time 表示每帧持续时间;

  3. 接下来每一行代表一帧中的运动数据。每个 CHANNEL 按照顺序对应 Motion 中的每个数据。这些数据是按照前面 CHANNEL 定义顺序出现的。按照上面 BVH 结构的定义, 首先是根关节的平移量:Xposition, Yposition, Zposition, 接下来是根关节的旋转量:Xrotation, Yrotation, Zrotation ,然后是各个关节的旋转量。

Frames: 2
Frame Time:   0.016667
-0.001735   0.855388   0.315499   2.008551   7.606260  -0.798294  11.216058  -3.286777  -1.592436  13.521250  -1.153514  -4.213484 -17.754157  -3.216621   9.232892  -7.948705   0.211932  -1.528529   2.220789  -0.981058  -1.133630   2.071938  -6.311876   2.083844   2.020309  -0.533885 -19.342332  -5.129554 -37.575293 -50.190804   0.198025 -24.741038   4.442069   0.442380   2.547494   4.858004   1.951773  -5.809334  21.100535  23.710456  30.003467  53.240376   0.414981  10.414544   1.952633   3.576914  -9.482057   6.918939   1.457480  -0.035296   0.111891 -27.722826  -1.655032   2.430426  -2.964232  -5.507982   1.444119   2.239212  -3.180259  -0.892285  -0.008100  -0.007000   0.024400
...

通过每个 CHANNEL 记录的数据和 Hierarchy 部分的树状定义,我们可以利用前向运动学(Forward Kinematics)的方法还原出每一帧的骨骼姿态。