Bvh里面的JOINT(以及ROOT)都表示一个坐标空间,我们称之为关节坐标空间,在这个坐标空间里, 它有下一级的子坐标空间(也就是下一级的JOINT),子坐标空间的原点位置由子JOINT的OFFSET字段指明,也就是说一个JOINT的OFFSET就是这个JOINT表示的坐标空间在父JOINT表示的坐标空间里的坐标,不管父JOINT如何变换(旋转、平移),这个JOINT在父JOINT坐标空间里的(位置)坐标是不变的,所以BVH文件里OFFSET是固定的值。一个JOINT坐标空间是可以变换的,JOINT坐标空间变换时,它的子JOINT也会随着一起变换,就好比是一个球,球心是JOINT表示的坐标空间的原点,这个球就是这个JOINT的坐标空间,球内有一点A,不管这个球如何变换(滚来滚去),点A也会随着变换(滚来滚去),点A相对球的位置是固定的。CHANNELS 指的是 关节点坐标空间的自由度,比如CHANNELS中含有Xroation,就表明这个JOINT的坐标空间是可以绕X轴旋转的。JOINT的自由度仅影响它自己表示的坐标空间以及它的子坐标空间,也就是说,不管一个JOINT如果变换,它在父坐标空间里的位置是不变的。如果CHANNELS中含有平移自由度,那说明这个JOINT的坐标空间是可以平移的,这时候,JOINT坐标空间的原点就可能不是在OFFSET指明的位置,这种情况下,父JOINT的骨骼长度仍由子JOINT的OFFSET计算得来,而子JOINT的骨骼的起始位置就不是OFFSET指明的位置了,而是OFFSET+CHANNELS中的平移量。骨骼端点相对关节点坐标系的变换矩阵,如果CHANNELS里没有POSITION ,表明骨骼端点与关节点重合,(http://t.zoukankan.com/vickylinj-p-13827826.html:
而一般JOINT只有3个,较之ROOT缺少了XYZ的position信息,因为子关节只需要根据它相对于父关节的偏移就可以算出它在坐标系中的具体位置了)
MOTION的数据是按照深度优先顺序排列的。
关节表示的坐标系朝向:默认与世界坐标系朝向一致,想象一下假如所有的JOINT它的CHANNELS里都没有旋转自由度,那么每个JOINT的坐标系相当于是把世界坐标系做了平移操作。CHANNELS里的旋转自由度,表示把父关节的坐标系在平移到OFFSET处后,再进行旋转操作。注意这里说的父关节坐标系,是指世界坐标系经过平移旋转后得到的坐标系,而不是“骨骼朝向为Y轴正向”这个坐标系。
关节点通过OFFSET就可以确定位置,OFFSET表示的是相对于父关节点的偏移。
在rest position(初始位置)下,关节点的坐标系与世界坐标系的三个轴的方向一致,只是原点位置不同。
骨骼端点的位置由CHANNELS 中POSITION字段与 关节的OFFSET共同决定,骨骼的朝向由CHANNELS的Rotation字段决定.
如:https://research.cs.wisc.edu/graphics/Courses/cs-838-1999/Jeff/Example1.bvh
HIERARCHY ROOT Hips { OFFSET 0.00 0.00 0.00 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT Chest { OFFSET 0.00 5.21 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT Neck { OFFSET 0.00 18.65 0.00 CHANNELS 3 Zrotation Xrotation Yrotation JOINT Head { OFFSET 0.00 5.45 0.00 CHANNELS 3 Zrotation Xrotation Yrotation End Site { OFFSET 0.00 3.87 0.00 } } }
}
}