Jas
Jas

Reputation: 870

Assimp calculating bones

Ive been trying to load my skinned collada mesh using assimp for the last few days but am having an extremely hard time. Currently I am just trying to render it in its normal "pose" without any transformations or animations but the mesh comes very deformed. I think the problem lies in my bones, not my weights so I am only posting the bone section.

Here is my bone loading code:

// this is done for every bone in a for loop:
Bone new_bone;

new_bone.name = std::string(bone->mName.data);

aiMatrix4x4 b_matrix = bone->mOffsetMatrix;
aiMatrix4x4 g_inv = scene->mRootNode->mTransformation;
g_inv.Inverse(); // according to a tutorial, you have to multiply by inverse root
b_matrix = b_matrix * g_inv;
memcpy(new_bone.matrix, &b_matrix, sizeof(float) * 16);

Bones.push_back(new_bone);

Then I simply send this to my shader with

glUniformMatrix4fv(MatrixArray, bone_count, GL_FALSE, &MATRIX_BUFFER[0][0][0]);

And apply it in the vertex shader with:

mat4 Bone = V_MatrixArray[int(Indicies[0])] * Weights[0];
Bone += V_MatrixArray[int(Indicies[1])] * Weights[1];
Bone += V_MatrixArray[int(Indicies[2])] * Weights[2];
Bone += V_MatrixArray[int(Indicies[3])] * Weights[3];

vec4 v = Bone * vec4(Vertex, 1);
gl_Position = MVP * vec4(v.xyz, 1);

This code mostly works, however my mesh is very deformed.... It looks like this:

enter image description here

According to the reserach ive done so far:

Please correct me if I am mistaken about these last 2 things.

Upvotes: 1

Views: 2683

Answers (1)

Jas
Jas

Reputation: 870

I managed to solve it. Turns out you DO need to read the nodes, even for a simple bind pose without animation. For any future readers with this issue, each bones matrix = root_node_inverse * matrix concatenated from node heirechy * bone offset matrix.

Upvotes: 1

Related Questions