From 347286aa1f85497e15792491c647ff3d06eacc6c Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 4 Feb 2021 12:17:58 +0200 Subject: [PATCH] fixed morphing when moving bones --- mesh.cpp | 1 - texture.vert | 42 +++++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/mesh.cpp b/mesh.cpp index edea262..d9abf3c 100755 --- a/mesh.cpp +++ b/mesh.cpp @@ -195,7 +195,6 @@ namespace vb01{ shader->setVec3(scale, "bones[" + to_string(i) + "].scale"); shader->setInt(vertGroupId, "bones[" + to_string(i) + "].vertGroup"); shader->setInt(parentId, "bones[" + to_string(i) + "].parent"); - shader->setInt(i, "bones[" + to_string(i) + "].id"); } } diff --git a/texture.vert b/texture.vert index ba6062e..7b4c3d6 100755 --- a/texture.vert +++ b/texture.vert @@ -5,6 +5,7 @@ const int numVertGroups=1; const int numMaxInfluences = 4; mat4 transform[numBones]; +mat4 poseTransform[numBones]; layout (location=0) in vec3 aPos; layout (location=1) in vec3 aNorm; @@ -23,7 +24,7 @@ out vec2 texCoords; struct Bone{ float angle; vec3 pos,trans,rotAxis,scale; - int vertGroup,parent,id; + int vertGroup,parent; }; uniform bool animated; @@ -76,32 +77,39 @@ float getWeight(Bone bone){ void main(){ vec4 vertPos = vec4(aPos, 1); - if(animated){ + bool anyWeights = false; + for(int i = 0; i < numMaxInfluences; i++) + if(aWeight[i] > 0) + anyWeights = true; + + if(animated && anyWeights){ for(int i = 0; i < numBones; i++){ transform[i] = createTranslationMatrix(bones[i].pos); + vec3 trans = bones[i].trans; + float angle = bones[i].angle; + vec3 axis = bones[i].rotAxis; + vec3 scale = bones[i].scale; + mat4 animTransform = createTranslationMatrix(trans) * createRotationMatrix(angle, axis) * createScaleMatrix(scale); + poseTransform[i] = transform[i] * animTransform; } + for(int i = 1; i < numBones; i++){ + mat4 localTransform = inverse(transform[bones[i].parent]) * poseTransform[i]; + poseTransform[i] = poseTransform[bones[i].parent] * localTransform; + } + + vec3 v = vec3(0); for(int i = 0; i < numBones; i++){ - Bone bone = bones[i]; - float weight = getWeight(bone); - while(bone.parent != -1){ - vec3 trans = bone.trans; - float angle = bone.angle; - vec3 axis = bone.rotAxis; - vec3 scale = bone.scale; - - mat4 animTransform = createTranslationMatrix(weight * trans) * createRotationMatrix(weight * angle, axis); + float weight = getWeight(bones[i]); + vec4 boneLocalVert = inverse(transform[i]) * vertPos; + v += (weight * poseTransform[i] * boneLocalVert).xyz; - vec4 boneLocalVert = inverse(transform[bone.id]) * vertPos; - vertPos = (transform[bone.id] * animTransform * boneLocalVert); - - bone = bones[bone.parent]; - } } + vertPos.xyz = v; } gl_Position = proj * view * model * vertPos; - fragPos = vec3(model * vec4(aPos, 1)); + fragPos = vec3(model * vertPos); norm = mat3(transpose(inverse(model))) * aNorm; tan = mat3(transpose(inverse(model))) * aTan; biTan = mat3(transpose(inverse(model))) * aBiTan;