基于编辑模式下的骨骼结构,骨骼旋转不正确

时间:2020-09-26 08:29:21

标签: c++ opengl blender glm-math assimp

我在关于asimp和搅拌器出口方面遇到麻烦/问题。我将模型从搅拌器导出到gltf二进制文件(.glb),并且一切正常,除非搅拌器内部的骨骼不在姿势模式下旋转(在编辑模式下创建并旋转),我很好奇能否在代码,否则我必须修改Blender的导出以解决此问题。comparison

如您所见,在第一次比较中,一个骨骼朝上,第二个骨骼在编辑模式下旋转,从而导致其旋转不正确。

这是我的c ++代码,用于计算动画矩阵

class Bone
{
    public:
    int Id;
    glm::mat4 Transform;
    Bone* BoneParent;
    std::vector<Bone*> BoneChild;
    glm::mat4 NodeTran;
    glm::mat4 MTran;
    
    std::vector<glm::vec3> LocFrames;
    std::vector<glm::quat> RotFrames;
    std::vector<glm::vec3> ScaleFrames;
    glm::mat4 Offset;

    
    
    glm::mat4 getLocalTransform()
    {
        float Factor= 1.0;

                    glm::vec3 T= this->LocFrames[1]+ (Factor * (this->LocFrames[1] - this->LocFrames[0]));
                    glm::mat4 TR = glm::translate(glm::mat4(1.0f), T);
                    
                    
                    glm::quat R = glm::normalize(glm::mix(this->RotFrames[0],this->RotFrames[1],Factor));
                    glm::mat4 RT = glm::toMat4(R);
                    
                    return TR*RT ;
        
    }
    
    
    glm::mat4 getParentTransform()
{
    if (this->BoneParent){
        return BoneParent->NodeTran;
        
        
    }
    else {
        return glm::mat4(1.0f);
        
    }
}

    class Skeleton
{
    public:
    std::vector<Bone> BoneList;
    Bone *Root;
    glm::mat4 inverse;
    aiMatrix4x4 inverseai;
    void Calc(Bone* bone = NULL)
    {
    

    
    bone->NodeTran = bone->getParentTransform()* // parent
    bone->getLocalTransform(); // T*R

    bone->Transform = inverse * // ai inverse
    bone->MTran* // node->mTransformation of bone
    bone->NodeTran*
    bone->Offset; // bone->mOffsetMatrix
    for (int i = 0; i < bone->BoneChild.size(); i++) {

       Calc(bone->BoneChild[i]);
    }
    
    }

    };

//...
//...
ObjModel->ModelSkeleton.Calc(ObjModel->ModelSkeleton.Root);
for(int i=0; i<ObjModel->ModelSkeleton.BoneList.size();i++){
glm::mat4 matrix = ObjModel->ModelSkeleton.BoneList[i].Transform;
        glUniformMatrix4fv(glGetUniformLocation(ActiveShader->ID, "Anim[0]")+i, 1, GL_FALSE, glm::value_ptr(matrix );
}

1 个答案:

答案 0 :(得分:0)

通过调试各种东西,我发现blender / assimp gltf2导入器将骨骼平移(旋转,位置,大小)和节点(静态骨骼)的偏移量放置在位置/旋转/比例框架中,我通过以下方法解决了这一问题: / p>

  1. 创建“无生命”序列,顾名思义,其中包含无生命的骨骼
  2. 保存未设置动画的位置/腐烂/缩放帧
  3. 用未设置动画的帧减去所有动画帧

我知道这是一个“ hackfix”,但这是我无法理解的,因为该错误位于Blender或assimp import内部

相关问题