use inverse bind matrices for bind pose in gltf loader (#5832)
This commit is contained in:
+29
-10
@@ -6144,17 +6144,36 @@ static Model LoadGLTF(const char *fileName)
|
|||||||
|
|
||||||
for (int i = 0; i < model.skeleton.boneCount; i++)
|
for (int i = 0; i < model.skeleton.boneCount; i++)
|
||||||
{
|
{
|
||||||
cgltf_node *node = skin.joints[i];
|
Matrix bindMatrix = { 0 };
|
||||||
cgltf_float worldTransform[16];
|
cgltf_float inverseBindTransform[16] = { 0 };
|
||||||
cgltf_node_transform_world(node, worldTransform);
|
|
||||||
Matrix worldMatrix = {
|
|
||||||
worldTransform[0], worldTransform[4], worldTransform[8], worldTransform[12],
|
|
||||||
worldTransform[1], worldTransform[5], worldTransform[9], worldTransform[13],
|
|
||||||
worldTransform[2], worldTransform[6], worldTransform[10], worldTransform[14],
|
|
||||||
worldTransform[3], worldTransform[7], worldTransform[11], worldTransform[15]
|
|
||||||
};
|
|
||||||
|
|
||||||
MatrixDecompose(worldMatrix,
|
if ((skin.inverse_bind_matrices != NULL) &&
|
||||||
|
(skin.inverse_bind_matrices->count >= skin.joints_count) &&
|
||||||
|
cgltf_accessor_read_float(skin.inverse_bind_matrices, i, inverseBindTransform, 16))
|
||||||
|
{
|
||||||
|
Matrix inverseBindMatrix = {
|
||||||
|
inverseBindTransform[0], inverseBindTransform[4], inverseBindTransform[8], inverseBindTransform[12],
|
||||||
|
inverseBindTransform[1], inverseBindTransform[5], inverseBindTransform[9], inverseBindTransform[13],
|
||||||
|
inverseBindTransform[2], inverseBindTransform[6], inverseBindTransform[10], inverseBindTransform[14],
|
||||||
|
inverseBindTransform[3], inverseBindTransform[7], inverseBindTransform[11], inverseBindTransform[15]
|
||||||
|
};
|
||||||
|
bindMatrix = MatrixInvert(inverseBindMatrix);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cgltf_float worldTransform[16] = { 0 };
|
||||||
|
cgltf_node_transform_world(skin.joints[i], worldTransform);
|
||||||
|
|
||||||
|
Matrix worldMatrix = {
|
||||||
|
worldTransform[0], worldTransform[4], worldTransform[8], worldTransform[12],
|
||||||
|
worldTransform[1], worldTransform[5], worldTransform[9], worldTransform[13],
|
||||||
|
worldTransform[2], worldTransform[6], worldTransform[10], worldTransform[14],
|
||||||
|
worldTransform[3], worldTransform[7], worldTransform[11], worldTransform[15]
|
||||||
|
};
|
||||||
|
bindMatrix = worldMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
MatrixDecompose(bindMatrix,
|
||||||
&(model.skeleton.bindPose[i].translation),
|
&(model.skeleton.bindPose[i].translation),
|
||||||
&(model.skeleton.bindPose[i].rotation),
|
&(model.skeleton.bindPose[i].rotation),
|
||||||
&(model.skeleton.bindPose[i].scale));
|
&(model.skeleton.bindPose[i].scale));
|
||||||
|
|||||||
Reference in New Issue
Block a user