2
$\begingroup$

I am trying to understand the Blender Python API, more specifically Bone and PoseBone types and how they fit in with skeletal animation.

This is how I understand it so far:

The Bone type holds the transformation matrix from the bone's local space to its' parent object's space in its' matrix_local property.

There is one PoseBone for each Bone in a scene for each frame of an animation. Another way to put it is: There is a pose for each frame of the animation and this pose's skeleton (for the current frame) is made up of PoseBone objects.

Each PoseBone holds the transformation matrix to transform the position of the bone in its' bind pose to it's position in the current frame. This transformation can be accessed through the scale, rotation_quaternion and location properties. If I apply these to the position of the bone in its' bind pose, then the bone will be moved to its' correct position for the current frame.

Each Bone has a head and a tail. As I understand it, the head is the origin of the bone's local coordinate space. So the "position" of the bone I mentioned earlier is also the position of the bone's head.

Am I correct in my understanding so far?


I am trying to create an animation system where the bone is initially in its' bind pose. There is a 4x4 transformation matrix to transform from object space to bone space. We use this to compute the origin/position of the bone in its' bind pose.

For each frame of the animation, the scale, rotation_quaternion, and location are used to transform the position of the bone from its' inverse bind pose to the pose in the current frame.

One thing that is not clear to me is what the rotation_quaternion represents here. How do I use it to compute the position of the bone in the current frame?


There is something else unclear to me. I understand that for skeletal animation in Blender, each vertex of a mesh has a list of bones that its' bound to, with an associated weight for each bone.

How is the final position of the vertex computed for each frame? Can I make a transformation matrix from the scale, rotation_quaternion and location properties, compute a weighted average of the matrices for each group, and use that to transform the vertex's position from its' bind pose? Again, I am not sure how to fit in the rotation_quaternion here.

As well, does the tail of the bone matter at all for the vertex skinning? As I understand it so far, all I need to know to compute the final position of the vertex for the frame are the SQT transforms of the relevant bones.


I am stuck on this and would appreciate someone helping me straighten this out. The documentation is appreciated but I think I am missing some essential details for what I need to do that I can't find in the documentation.

Partial answers and hints will still be appreciated.

Thanks,

YUNG PROGRAMMER

$\endgroup$
0
$\begingroup$

using quaternion for rotation does prevent gimbal lock, see Why are quaternions used for rotations?

Use it to set the rotation part of your final matrix at time t. See mathutils for conversion

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.