Assimp - анимация с Vertex Shader, какую часть я сделал не так? - PullRequest
0 голосов
/ 11 октября 2019

Эти данные загружаются из Assimp.

Я создал структуру, чтобы сохранить влияние костей на вершины, например:

struct VertexBonesData
{
    unsigned int BoneIDs[4];
    float Weights[4];
    VertexBonesData() {}
};

И использовал glVertexAttribPointer, чтобы сохранить их в буфере. VertexShader:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;

layout (location = 5) in ivec4 boneID;
layout (location = 6) in vec4 boneWeight;
//out vec2 TexCoords;

out VS_OUT {
    vec3 FragPos;
    vec3 Normal;
    vec2 TexCoords;
} vs_out;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform bool Has_Bones;

uniform mat4 boneTransform[16];
void main()
{
    vs_out.FragPos = vec3(model * vec4(aPos, 1.0));
    vs_out.Normal = transpose(inverse(mat3(model))) * aNormal;
    vs_out.TexCoords = aTexCoords;

    if(Has_Bones)
    {       
      mat4  boneTransformation0 = (boneTransform[boneID[0]]) * boneWeight[0];
      mat4  boneTransformation1 = (boneTransform[boneID[1]]) * boneWeight[1];
      mat4  boneTransformation2 = (boneTransform[boneID[2]]) * boneWeight[2];
      mat4  boneTransformation3 = (boneTransform[boneID[3]]) * boneWeight[3];

      mat4 boneTransformation = boneTransformation0 + boneTransformation1 + boneTransformation2 + boneTransformation3;
      vec4 PosL = boneTransformation * vec4(aPos, 1.0);
      gl_Position =  (projection * view * model) * PosL ; 
    }

    else
        gl_Position = projection * view * model * vec4(aPos, 1.0f); 
}

Я пытаюсь добавить boneTransforms в вершинный шейдер без анимации, просто преобразование костей, поэтому оно ничего не должно изменить (я думаю).

И вот что яполучил:
(я сделал сферы для отладки, проверьте преобразование кости.)

(равномерное mat4 boneTransform [16] - это то же значение, что и преобразование сферы (только позиция))

imgur: _result

Редактировать: я прочитал Урок 38 Скелетная анимация с Assimp , и я думаю, что я сделал то же самое.

Редактировать: ДОБАВИТЬ мойФункция ReadNodeHeirarchy,

FinalTransform - это значение, которое я отправил в boneTransform [Max_Bone];

void Mesh::ReadNodeHeirarchy(float AnimationTime, const aiNode *pNode, const aiMatrix4x4 &ParentTransform)
{
    string NodeName(pNode->mName.data);

    unsigned int BoneIndex = findIndex(vec_BonesData, NodeName);
    const aiAnimation* pAnimation = scene->mAnimations[0];
    aiMatrix4x4 NodeTransformation(pNode->mTransformation);
    const aiNodeAnim* pNodeAnim = FindNodeAnim(pAnimation, NodeName);

    aiMatrix4x4 BindPosMatrix = ParentTransform * NodeTransformation;

    if (pNodeAnim) 
    {
        // Interpolate scaling and generate scaling transformation matrix
        aiVector3D Scaling;
        CalcInterpolatedScaling(Scaling, AnimationTime, pNodeAnim);
        aiMatrix4x4 ScalingM;
        ScalingM = InitScaleTransform(Scaling.x, Scaling.y, Scaling.z);

        // Interpolate rotation and generate rotation transformation matrix
        aiQuaternion RotationQ;
        CalcInterpolatedRotation(RotationQ, AnimationTime, pNodeAnim);
        aiMatrix4x4 RotationM = aiMatrix4x4(RotationQ.GetMatrix());

        // Interpolate translation and generate translation transformation matrix
        aiVector3D Translation;
        CalcInterpolatedPosition(Translation, AnimationTime, pNodeAnim);
        aiMatrix4x4 TranslationM;
        TranslationM = InitTranslationTransform(Translation.x, Translation.y, Translation.z);

        // Combine the above transformations
        NodeTransformation = TranslationM * RotationM * ScalingM;
    }

    aiMatrix4x4 AnimationMatrix = ParentTransform * NodeTransformation;

    vec_BonesData[BoneIndex]->FinalTransform = BindPosMatrix.Inverse() * AnimationMatrix;

    for (unsigned int i = 0; i < pNode->mNumChildren; i++) 
    {
        ReadNodeHeirarchy(AnimationTime, pNode->mChildren[i], AnimationMatrix);
    }
}

_result после порядка изменений

Теперь япытаясь выяснить, где я должен умножить новую матрицу после вычисления из анимации.

...