mirror of
https://github.com/overte-org/overte.git
synced 2025-04-18 00:26:33 +02:00
Bug fix for twisted knees on some avatars.
The FBXReader inverse bind pose calculation can sometimes introduce floating point fuzz into
the bottom row of the matrix. The Transform class checks this bottom row before doing decomposition
into translation, rotation and scale. If it detects that this row is not exactly (0, 0, 0, 1) it aborts.
And returns identity. To guarantee that it preforms the decomposition correctly slam the row to (0, 0, 0, 1),
before conversion to a Transform instance.
(cherry picked from commit 991ba7f195
)
This commit is contained in:
parent
e081808ace
commit
1ad65b8da5
2 changed files with 14 additions and 4 deletions
|
@ -1733,8 +1733,18 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
|||
qCDebug(modelformat) << "Joint not in model list: " << jointID;
|
||||
fbxCluster.jointIndex = 0;
|
||||
}
|
||||
|
||||
fbxCluster.inverseBindMatrix = glm::inverse(cluster.transformLink) * modelTransform;
|
||||
|
||||
// slam bottom row to (0, 0, 0, 1), we KNOW this is not a perspective matrix and
|
||||
// sometimes floating point fuzz can be introduced after the inverse.
|
||||
fbxCluster.inverseBindMatrix[0][3] = 0.0f;
|
||||
fbxCluster.inverseBindMatrix[1][3] = 0.0f;
|
||||
fbxCluster.inverseBindMatrix[2][3] = 0.0f;
|
||||
fbxCluster.inverseBindMatrix[3][3] = 1.0f;
|
||||
|
||||
fbxCluster.inverseBindTransform = Transform(fbxCluster.inverseBindMatrix);
|
||||
|
||||
extracted.mesh.clusters.append(fbxCluster);
|
||||
|
||||
// override the bind rotation with the transform link
|
||||
|
@ -1836,13 +1846,13 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
|||
}
|
||||
|
||||
// now that we've accumulated the most relevant weights for each vertex
|
||||
// normalize and compress to 8-bits
|
||||
// normalize and compress to 16-bits
|
||||
extracted.mesh.clusterWeights.fill(0, numClusterIndices);
|
||||
int numVertices = extracted.mesh.vertices.size();
|
||||
for (int i = 0; i < numVertices; ++i) {
|
||||
int j = i * WEIGHTS_PER_VERTEX;
|
||||
|
||||
// normalize weights into uint8_t
|
||||
// normalize weights into uint16_t
|
||||
float totalWeight = weightAccumulators[j];
|
||||
for (int k = j + 1; k < j + WEIGHTS_PER_VERTEX; ++k) {
|
||||
totalWeight += weightAccumulators[k];
|
||||
|
|
|
@ -39,12 +39,12 @@ mat4 dualQuatToMat4(vec4 real, vec4 dual) {
|
|||
twoRealXZ - twoRealYW,
|
||||
0.0);
|
||||
vec4 col1 = vec4(twoRealXY - twoRealZW,
|
||||
1 - twoRealXSq - twoRealZSq,
|
||||
1.0 - twoRealXSq - twoRealZSq,
|
||||
twoRealYZ + twoRealXW,
|
||||
0.0);
|
||||
vec4 col2 = vec4(twoRealXZ + twoRealYW,
|
||||
twoRealYZ - twoRealXW,
|
||||
1 - twoRealXSq - twoRealYSq,
|
||||
1.0 - twoRealXSq - twoRealYSq,
|
||||
0.0);
|
||||
vec4 col3 = vec4(2.0 * (-dual.w * real.x + dual.x * real.w - dual.y * real.z + dual.z * real.y),
|
||||
2.0 * (-dual.w * real.y + dual.x * real.z + dual.y * real.w - dual.z * real.x),
|
||||
|
|
Loading…
Reference in a new issue