mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-27 03:53:24 +00:00
more precise vert weight distribution
This commit is contained in:
@@ -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
@@ -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
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user