Ох, ещё бы вспомнить как я это делал )) 
 Кости самого скелета у меня считаются так: 
 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)