In Blender, an Action is a sequence of key frames representing a character gesture (walking, jumping, slashing, falling, etc…). Actions are used as building blocks in Blender’s non linear animation (NLA) editor. We can use actions to create ‘animation catalogues’. An export script using actions might be used to batch export all animations for one or several characters, so we can update our game assets whenever we need, which simplifies and enhances flow.
Interactive Scripting Session
For this session, I have created a little robot – ‘funbot’ and an armature for it.
I then create two actions and detach them from the funbot. To take advantage of actions, we need to make each action current, i.e. for every action we attach the action to the armature and export all frames or key frames (either the armature frames/keyframes or the deformed mesh) before moving to the next action. Time for scripting:
#retrieve the action dictionary actions=Blender.Armature.NLA.GetActions() #get an action named 'nod' (as defined by your animator) action=actions.get("nod") #the following prints '[Action "nod"]' armature=Object.Get("FunBotArmature") #this makes the action current for the armature, #so we can playback the action and record it. action.setActive(armature) #even if you call this, the window won't update, but the underlying #model does, which is what we need for export. scene=Blender.Scene.GetCurrent() scene.update(1)
The above script does nearly everything we need related to actions – giving access to all defined actions within a blender file, it retrieves an action by name, applies it to the correct armature and updates the scene; at this point we’re nearly ready to iterate action frames and export the model and/or armature to a file (see my interactive session on exporting meshes deformed using an armature)
Just one more thing we need is knowing the number of frames in the animation. We can actually get better than just the number of frames – instead, we can get the list of keyframes, in ascending order:
#get the list of keyframes keys=action.getFrameNumbers() #print all keyframe indices, like ' [1,11,24,36,] ' list(keys) #print the length of the animation keys[len(keys)-1]
Using this, we can choose to either export only keyframes (use less memory), or all frames in the animation (OK for really simple animations and models).