0

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

所有顶点都有一个奇怪的变换,其中根骨骼(覆盖整个网格以进行定向)不是唯一对该顶点有影响的骨骼。您可以在网格的手臂/应该/颈部区域看到它。该网格有 3 个骨骼。一个根骨覆盖整个网格和两个臂骨。您可以看到网格在背景中的样子(导出为 obj) 在此处输入图像描述

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

1.我将所有顶点数据加载到一个大vbo(顶点,uvs,法线,切线,双切线,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";
    }

我将joint->invBindPose的转置(否则网格倒置)存储在boneMatrices中并将其发送到着色器:

boneMatrix 是 matrix4 的 std::vector

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

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

4

0 回答 0