ASSIMP的骨骼动画

时间:2017-03-02 21:50:54

标签: c++ opengl assimp

我一直在尝试使用ASSIMP在我自己的3D openGL / c ++游戏引擎中实现骨架动画来导入模型。

我认为问题是由骨骼矩阵的计算引起的,在着色器中作为统一变量加载,因为如果我将它们分配给身份,则网格会以其绑定姿势加载。

这些是我用来初始化和计算就绪骨基质的函数:

    void Joint::AddToSceneGraph(GameObject* root)
    {
        GameObject* parent = root->FindChild(m_name);
        //m_globalInverseMatrix = inverse(root->GetTransform().GetMatrix());
        parent->AddComponent(this);
        while (parent->GetParent() != root)
            parent = parent->GetParent();

        parent->GetTransform().SetParent(NULL); (1)
    }

    mat4 Joint::GetMatrix()
    {
        mat4 ans = /*m_globalInverseMatrix*/GetTransform().GetMatrix()*m_offsetMatrix;
        return ans;
    }

由于我试图以绑定姿势渲染模型,因此我不会为您提供计算动画矩阵的代码。

一些澄清 - 我有一个Transform类,它有Transform * parent,其GetMatrix()方法从父元素计算矩阵,缩放和翻译vec3s和旋转四元数,因此考虑了父元素和子元素之间的关系。我假设父节点的根关节变换必须为NULL,因此它的矩阵 - 标识,这是(1)的目的。虽然我不确定这个假设,但我确信具有骨架根的节点和包含网格的节点是兄弟姐妹。

此外,我不确定天气我应该使用m_globalInverseMatrix,还有它的目的究竟是什么。

总的来说,我认为我遇到的主要问题是误解ASSIMP如何计算offset matrix或所谓的inverse bind pose matrix以及如何反转其效果。这个问题导致模型本身看起来“打包”:

this is maybe the most famous md5 model

1 个答案:

答案 0 :(得分:3)

从Assimp的文档中,骨骼的偏移矩阵从网格空间转换为骨骼空间。

我设法使用类似于你的层次结构渲染绑定pos(如果我没有误解,你有一个带有两个子节点的根节点,一个产生骨架层次结构,另一个产生网格)。您需要做的是将m_globalInverseMatrix设置为包含网格的节点的逆变换。然后,每个骨骼的变换是:

boneTransform = m_globalInverseMatrix * boneHierarchyTransforms * boneOffsetMatrix

boneHierarchyTransform来自遍历树到每个骨骼节点,boneOffsetMatrix是你提到的那个,我在第一段中提到过。