首页 > 解决方案 > 如何将 bvh 文件解析为用 OpenGL 制作的骨架模型?

问题描述

我正在尝试将 bvh 数据解析为我已经使用 OpenGL 开发的骨架。关于数据解析,我对一件事感到好奇。

Bvh 数据有两部分,即 HIERARCHY 和 MOTION。HIERARCHY 指定树结构和 OFFSET 数据,用于推断父骨骼的长度。MOTION 指定根骨骼的位置和每个骨骼的关节配置。

我已经用 HIERARCHY 中提到的骨骼制作了我的模型。我也在 HIERARCHY 中提到的相同树结构下制作了我的模型。(当然骨骼之间的长度是我任意设置的,因为模型是在解析文件数据之前制作的。所以建模骨骼的长度实际上与OFFSET数据有点不同。)

由于我已经制作了我想要动画的模型,这是否意味着我可以忽略 HIERARCHY(=OFFSET) 部分,而只需读取 MOTION 数据部分以获得每个关节的关节配置?

我觉得这是一个非常明显的问题,但感觉有些不对劲,因为这意味着我可以忽略文件的前半部分(HIERARCHY),而只为它的后半部分制作一个解析器。

文件的前半部分是否有任何我可能遗漏的细节?

标签: animationopenglmotionskeletal-animation

解决方案


BVH HIERARCHY包含骨架的初始姿势(没有任何MOTION数据)。所以OFFSET实际上也定义了每个骨骼的初始方向。如果您忽略它,您将失去 BVH 和网格之间的同步。你需要做的是:

  1. 解析整个HIERARCHY结构
  2. 对于每个骨骼计算变换,具有将网格与 BVH 初始位置对齐的比例

    这并不像听起来那么容易,因为在 BVH 中每个骨骼都有两个端点。但是对于网格的正确位置来说,这还不够,因为它缺少围绕骨轴的旋转。比例是 BVH 骨骼和网格骨骼大小之间的简单比率。

    您需要的是构建 4x4 同质矩阵。这里有一些关于如何的想法:

  3. 解析整个MOTION数据

  4. 对于每一帧

    计算到达骨骼的变换矩阵并将其应用于您的网格(连同初始位置矩阵)。

我强烈建议仅使用线条来解析/播放 BVH,而无需任何网格。并且只有在它正常工作的情况下才能进入下一个级别。因为根据使用的符号矩阵乘法顺序和坐标系,您可能会损坏输出。这会让你很难调试它上面的东西。

当心旋转必须按照定义的顺序完成,并且没有任何偏移!

[编辑1]

这里有一些小的 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
                }
            }
        }
        JOINT LeftCollar
        {
            OFFSET   1.12    16.23   1.87
            CHANNELS 3 Zrotation Xrotation Yrotation
            JOINT LeftUpArm
            {
                OFFSET   5.54    0.00    0.00
                CHANNELS 3 Zrotation Xrotation Yrotation
                JOINT LeftLowArm
                {
                    OFFSET   0.00   -11.96   0.00
                    CHANNELS 3 Zrotation Xrotation Yrotation
                    JOINT LeftHand
                    {
                        OFFSET   0.00   -9.93    0.00
                        CHANNELS 3 Zrotation Xrotation Yrotation
                        End Site 
                        {
                            OFFSET   0.00   -7.00    0.00
                        }
                    }
                }
            }
        }
        JOINT RightCollar
        {
            OFFSET  -1.12    16.23   1.87
            CHANNELS 3 Zrotation Xrotation Yrotation
            JOINT RightUpArm
            {
                OFFSET  -6.07    0.00    0.00
                CHANNELS 3 Zrotation Xrotation Yrotation
                JOINT RightLowArm
                {
                    OFFSET   0.00   -11.82   0.00
                    CHANNELS 3 Zrotation Xrotation Yrotation
                    JOINT RightHand
                    {
                        OFFSET   0.00   -10.65   0.00
                        CHANNELS 3 Zrotation Xrotation Yrotation
                        End Site 
                        {
                            OFFSET   0.00   -7.00    0.00
                        }
                    }
                }
            }
        }
    }
    JOINT LeftUpLeg
    {
        OFFSET   3.91    0.00    0.00
        CHANNELS 3 Zrotation Xrotation Yrotation
        JOINT LeftLowLeg
        {
            OFFSET   0.00   -18.34   0.00
            CHANNELS 3 Zrotation Xrotation Yrotation
            JOINT LeftFoot
            {
                OFFSET   0.00   -17.37   0.00
                CHANNELS 3 Zrotation Xrotation Yrotation
                End Site 
                {
                    OFFSET   0.00   -3.46    0.00
                }
            }
        }
    }
    JOINT RightUpLeg
    {
        OFFSET  -3.91    0.00    0.00
        CHANNELS 3 Zrotation Xrotation Yrotation
        JOINT RightLowLeg
        {
            OFFSET   0.00   -17.63   0.00
            CHANNELS 3 Zrotation Xrotation Yrotation
            JOINT RightFoot
            {
                OFFSET   0.00   -17.14   0.00
                CHANNELS 3 Zrotation Xrotation Yrotation
                End Site 
                {
                    OFFSET   0.00   -3.75    0.00
                }
            }
        }
    }
}
MOTION
Frames:    2
Frame Time: 0.033333
 8.03    35.01   88.36  -3.41    14.78  -164.35  13.09   40.30  -24.60   7.88    43.80   0.00   -3.61   -41.45   5.82    10.08   0.00    10.21   97.95  -23.53  -2.14   -101.86 -80.77  -98.91   0.69    0.03    0.00   -14.04   0.00   -10.50  -85.52  -13.72  -102.93  61.91  -61.18   65.18  -1.57    0.69    0.02    15.00   22.78  -5.92    14.93   49.99   6.60    0.00   -1.14    0.00   -16.58  -10.51  -3.11    15.38   52.66  -21.80   0.00   -23.95   0.00   
 7.81    35.10   86.47  -3.78    12.94  -166.97  12.64   42.57  -22.34   7.67    43.61   0.00   -4.23   -41.41   4.89    19.10   0.00    4.16    93.12  -9.69   -9.43    132.67 -81.86   136.80  0.70    0.37    0.00   -8.62    0.00   -21.82  -87.31  -27.57  -100.09  56.17  -61.56   58.72  -1.63    0.95    0.03    13.16   15.44  -3.56    7.97    59.29   4.97    0.00    1.64    0.00   -17.18  -10.02  -3.08    13.56   53.38  -18.07   0.00   -25.93   0.00    

在这里预览:

预习

左边是骨架,没有应用MOTION数据(纯偏移),因为您可以看到它的轴未对齐(但距离它不远),骨骼不在同一平面上并且旋转了一点。但是您需要考虑到初始配置和姿势可以是任何东西。

右侧是应用了MOTION数据的第一帧变换的预览。

另见:


推荐阅读