For something simple, you can simply just manually key change in each bone.
Writing a script would be the more efficient way. You’d need to write a script that would iterate through each bone in pose mode and add some change although you’d need some understanding of linear algebra and vector math. I wrote a small script for my personal use that isn’t well commented and the algorithm may be suspect. However, if the version 7.4 format is necessary, then I’ll paste my script for you to use and modify. I would’ve used version 6.1, but I need the blend shapes that the Blender 7.4 fbx output provides.
For the script, it’s not really an install-able script since I only use it personally based on my workflow. I could write the script as a real install-able Blender script but I haven’t bothered since I’m hoping for an official fix to the bug sooner or later. I just run the script using a text window in Blender. Open up a Blender window, create a new text data block with the “+” sign, paste in the script, and press the “Run Script” button with your armatures selected at preferably an already keyframed pose. That will run through all your armatures selected, pose each bone a small amount and key the pose. Basically, I animate first. Then after I animate, I apply the script to one of the keyframes. If the animation is a loop (like a walk, run, or idle), I apply the script to one of the keyframes in the between the first and last keyframes as to not dirty the first and last keys. In truth, the changes made by the script will not be visible to the naked eye so you can drop the dirty frame anywhere as long as it doesn’t mess up the timing on your animation.
Note: The Blender script interpreter is based off Python. Whitespace matters. If the script doesn’t work after being pasted, you’ll probably need to format the script so that the whitespace is correct. Hopefully, the CODE tag here will preserve the whitespace so you won’t have fix whitespace issues.
import bpy
import mathutils
# Create translation matrix to move translatable bones a trivial amount
mat_loc = mathutils.Matrix.Translation((0.0001, 0.0001, 0.0001))
# Create rotation matrices to rotate each bone a small amount on each axis
# TODO: Possibly better to create matrix from quaternion, my linear algebra sucks
mat_rot_X = mathutils.Matrix.Rotation(0.000001, 4, 'X')
mat_rot_Y = mathutils.Matrix.Rotation(0.000001, 4, 'Y')
mat_rot_Z = mathutils.Matrix.Rotation(0.000001, 4, 'Z')
# Create a transform matrix to apply translation and rotations
transform = mat_loc * mat_rot_X * mat_rot_Y * mat_rot_Z
# List to hold all selected armatures
armatureList = ]
# Set selection mode to OBJECT to be able to obtain object reference for each armature
bpy.ops.object.mode_set(mode='OBJECT')
# For each object selected, check if object is an armature
# and if so, add to armatureList
for obj in bpy.context.selected_objects:
if(obj.type == 'ARMATURE'):
armatureList.append(obj)
# Iterate through each armature and
# iterate through each pose bone
# Key each bone based off precomputed transform matrix
for armature in armatureList:
armature.select = True
bpy.ops.object.mode_set(mode='POSE')
for bone in armature.pose.bones:
bone.matrix = bone.matrix * transform
bpy.ops.pose.select_all(action='TOGGLE')
bpy.ops.anim.keyframe_insert_menu(type='WholeCharacter')
bpy.ops.object.mode_set(mode='OBJECT')