From b215eeadfa1556c931af470e6d3aeaacbf9d7ebb Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 21 Jan 2021 21:15:31 +0200 Subject: [PATCH] more precise vert weight distribution --- mesh.cpp | 2 +- texture.vert | 35 +++++++++++++++++++++-------------- vbModelReader.cpp | 16 ++++++++++++++-- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/mesh.cpp b/mesh.cpp index 76e7a51..009f5f5 100755 --- a/mesh.cpp +++ b/mesh.cpp @@ -170,7 +170,7 @@ namespace vb01{ Vector3 posePos = bone->getPosePos(); Quaternion poseRot = bone->getPoseRot(); Vector3 rotAxis = poseRot.getAxis(); - rotAxis = boneAxis[0] * rotAxis.x + boneAxis[1] * rotAxis.y + boneAxis[2] * rotAxis.z; + rotAxis = (boneAxis[0] * rotAxis.x + boneAxis[1] * rotAxis.y + boneAxis[2] * rotAxis.z).norm(); Vector3 trans = boneAxis[0] * posePos.x + boneAxis[1] * posePos.y + boneAxis[2] * posePos.z; Vector3 scale = bone->getPoseScale(); Vector3 bonePos = bone->getBoneSpaceRestPos(skeleton->getRootBone()); diff --git a/texture.vert b/texture.vert index 2596aec..5675da8 100755 --- a/texture.vert +++ b/texture.vert @@ -30,34 +30,40 @@ uniform mat4 model; uniform mat4 view; uniform mat4 proj; +mat4 createMatrix(float angle, vec3 axis){ + mat4 rotMat; + + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + rotMat[0] = vec4(oc * axis.x * axis.x + c,oc * axis.x * axis.y + axis.z * s,oc * axis.z * axis.x - axis.y * s, 0.0); + rotMat[1] = vec4(oc * axis.x * axis.y - axis.z * s,oc * axis.y * axis.y + c,oc * axis.y * axis.z + axis.x * s, 0.0); + rotMat[2] = vec4(oc * axis.z * axis.x + axis.y * s,oc * axis.y * axis.z - axis.x * s,oc * axis.z * axis.z + c, 0.0); + rotMat[3] = vec4(0, 0, 0, 1); + + return rotMat; +} + void main(){ - vec4 vertPos=vec4(aPos,1); + vec4 vertPos = vec4(aPos, 1); if(animated){ for(int i = 0; i < numBones; i++){ - Bone bone = bones[i]; float weight = 0; - for(int j = 0; j < numMaxInfluences; j++){ - if(bone.vertGroup == aBoneIndices[j]) + if(bones[i].vertGroup == aBoneIndices[j]) weight = aWeight[j]; } - while(bone.parent!=-1){ + Bone bone = bones[i]; + while(bone.parent != -1){ float angle = weight * bone.angle; vec3 trans = bone.trans; vec3 axis = bone.rotAxis; vec3 scale = bone.scale; vec4 bonePos = vec4(bone.pos, 1); - float s = sin(angle); - float c = cos(angle); - float oc = 1.0 - c; - - mat4 rotMat; - rotMat[0] = vec4(oc * axis.x * axis.x + c,oc * axis.x * axis.y + axis.z * s,oc * axis.z * axis.x - axis.y * s, 0.0); - rotMat[1] = vec4(oc * axis.x * axis.y - axis.z * s,oc * axis.y * axis.y + c,oc * axis.y * axis.z + axis.x * s, 0.0); - rotMat[2] = vec4(oc * axis.z * axis.x + axis.y * s,oc * axis.y * axis.z - axis.x * s,oc * axis.z * axis.z + c, 0.0); - rotMat[3] = vec4(0, 0, 0, 1); + mat4 rotMat = createMatrix(angle, axis); vertPos += -(vertPos - bonePos) + rotMat * (vertPos - bonePos); vec4 vertToBone = vec4(vertPos.xyz - bonePos.xyz, 1); @@ -65,6 +71,7 @@ void main(){ vertPos.xyz += weight * trans; bone = bones[bone.parent]; + } } } diff --git a/vbModelReader.cpp b/vbModelReader.cpp index 51aea26..153c9de 100644 --- a/vbModelReader.cpp +++ b/vbModelReader.cpp @@ -288,8 +288,20 @@ namespace vb01{ vertPos.push_back(vPos); vertNorm.push_back(vNorm); - for(int j = 0; j < numBones; j++) - vertWeights.push_back(atof(data[6 + j].c_str())); + float weightCoefs[numBones]; + for(int i = 0; i < numBones; i++) + weightCoefs[i] = atof(data[6 + i].c_str()); + + int numPosWeights = 0; + float sumWeightCoefs = 0; + for(int i = 0; i < numBones; i++) + if(weightCoefs[i] > 0){ + sumWeightCoefs += weightCoefs[i]; + } + + float root = 1. / sumWeightCoefs; + for(int i = 0; i < numBones; i++) + vertWeights.push_back(root * weightCoefs[i]); } }