Ох, ещё бы вспомнить как я это делал ))
Кости самого скелета у меня считаются так:
Code
if not obj.parent:
self.transform_matrix = arm_owner.matrix_world * obj.matrix_local
else:
self.transform_matrix = obj.parent.matrix_local.inverted() * obj.matrix_local
т.е. если нет родителя, то мировая матрица скелетона * локальную матрицу кости
если есть родитель, то инвертированная локальная матрица родительской кости на локальную матрицу рассчитываемой кости.
Анимация для костей считается примерно так же, только для анимации я полученную матрицу перевожу в углы эйлера и позицию, и записываю именно их.
Code
if bone.parent:
matrix = bone.parent.matrix.inverted() * bone.matrix
else:
matrix = arm.matrix_world * bone.matrix
p, r, h = matrix.to_euler()
anim_dict[bone.name]['p'].append(p/pi*180)
anim_dict[bone.name]['r'].append(r/pi*180)
anim_dict[bone.name]['h'].append(h/pi*180)
x, y, z = matrix.to_translation()
anim_dict[bone.name]['x'].append(x)
anim_dict[bone.name]['y'].append(y)
anim_dict[bone.name]['z'].append(z)