C++ 计算bindPose矩阵(骨骼动画)

C++ 计算bindPose矩阵(骨骼动画),c++,opengl,animation,matrix,skeletal-mesh,C++,Opengl,Animation,Matrix,Skeletal Mesh,我成功地解析了iqe(Inter-Quake Exporter)格式,现在我只能用bindpose显示了 所有顶点都有一个奇怪的变换,其中根骨骼(为方向覆盖整个网格)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。此网格有3个骨骼。一根根骨骼覆盖整个网格和两个手臂骨骼。 您可以看到网格在背景中的外观(导出为obj) 为了更好地理解,我有以下系统: 1。我将所有顶点数据加载到一个大的vbo中 (顶点、UV、法线、切线、双切线、骨骼索引(4)(关节列表索引)和骨骼权重(4)

我成功地解析了iqe(Inter-Quake Exporter)格式,现在我只能用bindpose显示了

所有顶点都有一个奇怪的变换,其中根骨骼(为方向覆盖整个网格)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。此网格有3个骨骼。一根根骨骼覆盖整个网格和两个手臂骨骼。 您可以看到网格在背景中的外观(导出为obj)

为了更好地理解,我有以下系统:

1。我将所有顶点数据加载到一个大的vbo中 (顶点、UV、法线、切线、双切线、骨骼索引(4)(关节列表索引)和骨骼权重(4))

2.我将所有关节添加到关节列表中,并创建一个树系统(带有位置、旋转和父指针的简单链表)

3.我有一个单独的列表,名为boneMatrices,我在其中存储。。我的骨基质。当前为每一帧,稍后我将预计算每个动画帧的矩阵

我尝试用以下方法计算骨骼矩阵:

    for (int i = 0; i < this->jointList.size(); i++)
    {
        pixel::CJoint *joint = this->jointList.at(i);


        std::cout << "Joint ------- " << joint->name << " -------- values: \n";
        std::cout << "Translation: " << joint->position.x << " " << joint->position.y << " " << joint->position.z << "\n";
        std::cout << "Quaternion: " << joint->rotation.x << " " << joint->rotation.y << " " << joint->rotation.z << " " << joint->rotation.w << "\n";


        pixel::matrix4 rotation = pixel::CMatrix::fromQuaternion(joint->rotation);
        pixel::matrix4 offset = pixel::CMatrix::translateMatrix(joint->position);
        pixel::matrix4 baseMatrix = rotation * offset; // translation * rotation


        joint->bindPose = baseMatrix;
        joint->invBindPose = pixel::CMatrix::inverseMatrix(baseMatrix);

        if (joint->parent != NULL)
        {
            std::cout << "Joint: " << joint->name << " is child of " << joint->parent->name << " \n";
            joint->bindPose = joint->bindPose * joint->parent->invBindPose;
            joint->invBindPose = pixel::CMatrix::inverseMatrix(joint->bindPose);
        }


        std::cout << "\n";
    }

根骨骼绑定计算必须正确(至少我认为),因为头部位置正确,眼睛也正确(目前没有骨骼影响)

查看屏幕截图:在对网格应用动画之前,是否折叠网格(将所有向量乘以基架骨骼的倒数)?很抱歉回复太晚。不,我不这样做。需要这个吗?我想是的,试试看。另外,你积累父矩阵的方式看起来可疑,但我不是C++专家,可以肯定地说。
this->material.setParameter("boneMatrix", this->boneMatrices.at(0), this->boneMatrices.size());