COLLADA importer

Does:

initialWorldspaceJointTransform * bindPoseInverse * skinBindMatrix

really compute the worldspace joint transform per each frame? Then perhaps:

initialRelativeJointTransform * bindPoseInverse * skinBindMatrix

computes the relative joint transform per each frame. But it’s probably not that easy, because you probably need to account for the transforms that are animating above. So what you really need is:

currentNetRelativeJointTransform * inverse(currentNetWorldspaceJointTransform) * above calculation

for each frame.

Still, this is all a little beside the point. If the vertices are coming out moved at all with a single-frame animation, it means that the transform does not exactly match the

transform. This is true regardless of the vertex influences. Whether the vertex influences are wrong or right, if the transforms exactly match, they won’t move from the original rest position–because you’re replacing transform A with transform A. Since they are moving, it follows that the transforms don’t exactly match.

If Collada insists on giving you worldspace transforms instead of relative transforms, you can hack around that by flattening out the hierarchy and moving every joint to the root of the hierarchy. That makes the relative transform the same thing as the worldspace transform. If that works, then you just need to figure out how to convert worldspace to relative transforms.

David