Animation 如何将bvh文件解析为OpenGL中制作的骨架模型?

Animation 如何将bvh文件解析为OpenGL中制作的骨架模型?,animation,opengl,motion,skeletal-animation,Animation,Opengl,Motion,Skeletal Animation,我正试图将bvh数据解析到我已经用OpenGL开发的骨架中。关于数据解析,有一件事我很好奇 Bvh数据分为层次和运动两部分。层次指定树结构和偏移数据,用于推断父骨骼的长度。运动指定根骨骼的位置和每个骨骼的关节配置 我已经用层次结构中提到的骨骼制作了模型。我在层次结构中提到的相同树结构下创建了我的模型。(当然,骨骼之间的长度由我任意设置,因为模型是在解析文件数据之前创建的。因此,建模骨骼的长度实际上与偏移数据略有不同。) 由于我已经制作了要设置动画的模型,这是否意味着我可以忽略层次(=偏移)部分,

我正试图将bvh数据解析到我已经用OpenGL开发的骨架中。关于数据解析,有一件事我很好奇

Bvh数据分为层次和运动两部分。层次指定树结构和偏移数据,用于推断父骨骼的长度。运动指定根骨骼的位置和每个骨骼的关节配置

我已经用层次结构中提到的骨骼制作了模型。我在层次结构中提到的相同树结构下创建了我的模型。(当然,骨骼之间的长度由我任意设置,因为模型是在解析文件数据之前创建的。因此,建模骨骼的长度实际上与偏移数据略有不同。)

由于我已经制作了要设置动画的模型,这是否意味着我可以忽略层次(=偏移)部分,只读取运动数据部分以获得每个关节的关节配置

我觉得这是一个非常明显的问题,但感觉有些不对劲,因为这意味着我可以忽略文件的前半部分(层次结构),只为文件的后半部分创建一个解析器


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

BVH
层次结构包含骨骼的初始姿势(没有任何
运动
数据)。因此,偏移量实际上也定义了每个骨骼的初始方向。如果忽略它,将丢失BVH和网格之间的同步。您需要做的是:

  • 解析整个
    层次结构
    结构
  • 对于每个骨骼,使用将网格与BVH初始位置对齐的比例计算变换

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

    你需要的是构造4x4同伦矩阵。以下是一些关于如何:

  • 解析整个
    运动
    数据

  • 对于每个帧

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

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

    注意旋转必须按照规定的顺序进行,并且没有任何偏移

    [edit1]

    以下是一些小型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    
    
    在此预览:

    左侧是未应用
    运动
    数据(纯偏移)的skelet,因为您可以看到它的轴未对齐(但离它不远)。骨骼不在同一平面内,并稍微旋转了一点。但是您需要考虑到初始配置和姿势可以是任何东西

    右侧是预览,其中应用了来自
    运动
    数据的第一帧变换

    另见:


    谢谢您的回答!但是我很困惑。。。所有骨骼的初始骨骼方向不是从开始时的(1.0,0.0,0.0),(0.0,1.0,0.0),(0.0,0.0,1.0)开始吗?@Peter这非常罕见。。。。是的,变换矩阵在开始时是单位,但骨骼可能根本没有轴对齐(相对于其父骨骼和子骨骼),我在示例中添加了Edit1。