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 部分有以下信息:
-
Frames 表示接下来动画中帧的数量;
-
Frame Time 表示每帧持续时间;
-
接下来每一行代表一帧中的运动数据。每个 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)的方法还原出每一帧的骨骼姿态。