这是一篇翻译,因为要了解一些BVH,看到一篇文章还不错,也不长,就边翻译边记录一下吧。
原文链接: http://www.mindfiresolutions.com/BVH-biovision-hierarchy.htm
原文作者:Manjunath
背景:
原文作者要将动画数据导出到 .bvh文件中,没有相关的SDK来写bvh文件,所以他就写了一个C++来导出animation data到bvh的代码。
BVH 介绍
BVH是一种动画格式,使用ROOT,JOINTS,OFFSET等术语来保存动画数据。
BVH 格式
【一张鬼畜的图,不说这个图魔性的时候都看不出来灵魂画手画的是啥。】
BVH Sample File
下面给出了一个非常简单的bvh文件的内容
—————————————— bvh sample ————————————————————————
HIERARCHY
ROOT Neck
{
OFFSET 0.000000 0.000000 0.000000
CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
JOINT Head
{
OFFSET 0.200000 0.400000 0.500000
CHANNELS 3 Zrotation Xrotation Yrotation
End Site
{
OFFSET 0.600000 8.000000 2.000000
}
}
}
MOTION
Frames: 1
Frame Time: 0.040000
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
BVH的详细介绍
一个bvh文件包含两个部分:Hierarchy 和 Motion
1. Hierarchy 骨骼层次
- BVH 文件以 HIERARCHY 关键词开始,这个部分包含了Root 根节点 和 Joints 骨骼。 以及他们的channels。(注:这个channels和Assimp中的channels是一个概念,但是我说不出来具体是啥!)
- Root 节点同时包含 Position channels 和 Rotation channels,我理解的是根骨骼是控制人体整个的运动,因此是可以有平移,也有旋转的变换的。
- 而Joint 骨骼 只有 Rotation channels,除了Root骨骼之外的,只能有旋转变换。
2. Motion 运动数据相关内容
- 这个部分包含了动画相关的数据,包括了 Frames:帧数,Frame Time: 帧率, 以及最重要的运动数据。每一行运动数据代表了一个,完整的帧,有所有骨骼的当前帧的运动数据。
- 一行运动数据 = Root channels + Joint channels
so,根据上面的 bvh 文件样例, 我们可以将运动数据和骨骼相映射:如下:
Neck Neck Neck Neck Neck Neck Head Head Head
X pos Y pos Z pos Z rot X rot Y rot Z rot X rot Y rot
0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
BVH 使用的关键词(Legends,i _ i 这样译感觉有点怪)
- HIERARCHY : 第一部分开始的声明
- Root: 根骨骼
- Joint: 子骨骼
- Channels: 一个 Root 或 Joint的 channel(position ,rotation)的数量
- Offset: 子骨骼到父骨骼的偏移量,包含了长度和方向信息。
- End Site: 一个骨骼信息的结束标识
- MOTION: motion部分的开始声明
- FRAMES: 帧数
- Frame Time: 数据的采样率,帧率吧
源码(未验证)就不贴了,贴出来格式就乱,见原文
参考文献
http://www.cs.cityu.edu.hk/~howard/Teaching/CS4185-5185-2007-SemA/Group12/BVH.html
http://www.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/BVH.html