计算bindPose矩阵(骨骼动画)

时间:2014-01-09 11:17:14

标签: c++ opengl animation matrix skeletal-mesh

我成功地解析了iqe(Inter Quake Exporter)格式,现在我坚持在bindpose中显示它。

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

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

1。我将所有顶点数据加载到一个大的vbo中 (vertices,uvs,normals,tangent,bitangent,boneIndicies(4)(联合列表索引)和boneWeights(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";
    }

我将关于&gt; invBindPose的转置(否则网格颠倒)存储在boneMatrices中并将其发送到着色器:

boneMatrix是matrix4的std :: vector

this->material.setParameter("boneMatrix", this->boneMatrices.at(0), this->boneMatrices.size());

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

0 个答案:

没有答案