more precise vert weight distribution

This commit is contained in:
devZoGok
2021-10-19 19:06:41 +03:00
parent 9903f6983b
commit b215eeadfa
3 changed files with 36 additions and 17 deletions
+1 -1
View File
@@ -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());
+21 -14
View File
@@ -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];
}
}
}
+14 -2
View File
@@ -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]);
}
}