Channel matrix?

The different types of bones have different types of matrices, and although I think I’ve figured out what most of them are, I’m still not quite sure what the channel matrix for pose bones is or how to reproduce it.

In terms of data paths, by “channel matrix” I mean this(assuming an armature with a bone is the active object):[“Insert bone name here”].matrix_channel

It seems like it’s a representation of the bone’s pose rotation based on the world’s orientation([0,-1,0]xyz = forward, [0,0,1]xyz = up, etc), as opposed to the matrix_basis which appears to be the rotation of the bone with respect to the bone’s world orientation. Am I right?

Thanks, that’s kind of embarassing… I tried looking it up awhile back but couldn’t really find anything myself.

I actually did a bunch of testing before I saw your post and I think I was able to figure it out independently. Going from that understanding it seems to me like

on stack exchange is the best description of it.

It was confusing for awhile, but it seems that although both are only dependent on factors in pose mode(from the armature’s rest state), the difference between matrix_basis and matrix_channel is that matrix_basis is the pose matrix according to the pose bone’s current local space at any given time. Or in other words, the difference between matrix_basis and matrix_channel is the offset of the armature parts higher in hierarchy than the bone(and probably other constraints which affect it). And the pose bone’s matrix includes the armature rest state offset as well. I think.

I went back and checked, and this is what I found before

It confused me while I was testing back then, because(if I’m not still mistaken) the word “constraint” there is referring to anything that causes an effect on the bone in pose mode, as opposed to the actual “bone constraints” in Blender’s menus.

I’m trying to write scripts and addons to improve Blender’s motion/pose functionality but it’s been very difficult due to ambiguity and my own ignorance of mathematics, and also because there doesn’t seem to be a bpy function(not ops) that allows you to rotate in world space(is there?), or an exact definition of what the rotate() function for mathutils objects does(until earlier today I thought it was absolute world space rotation but it appears the axis it uses actually factors in the object bone’s matrix_local and the pose bone’s matrix_channel, but not the pose bone’s matrix_basis).

My brain is already fried but I want to get a complete understanding of rotation in Blender and finish this…

EDIT: I did some more testing and it seems bone roll and tail vector actually do affect the channel matrix. So I guess those aren’t really accurate descriptions either, unless edit mode tail vector and bone roll aren’t considered part of the armature’s “rest” position(which seems a little wrong since they can’t be changed in pose mode).