Эти данные загружаются из 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 после порядка изменений
Теперь япытаясь выяснить, где я должен умножить новую матрицу после вычисления из анимации.