From BlenderWiki
13.03.16: NLA Editor
Nla Editor: None Linear Animation Editor.
these are some idears.
13.03.20: problems
make new action from current action
- this can be done.
auto sync length
- bool switch: auto sync length.
- bool switch: sync all strips with same action.
- problems with strips being to big.
blend interpolation
- not sure how it does it at the moment. but will need support for multiple strips.
change object
- should be ok.
smooth transition
- not sure about this yet. todo with transition between strips.
13.03.21: what do people do
- first usually, make an animation on the timeline, then freeze it.
- edit strip.
- duplicate strip.
- rename strip.
- bool switch: auto sync length.
- bool switch: sync all strips with same action.
- make new strip action from strip action.
- copy object[A].action to object[B].action then delete object[A].action.
- auto snap enum.
- folder feature, dont know what for: (00:00 youtube /watch?v=IBRqmeErOHU)
- its better for repetative game animations. or loop, like bird wings. or loop background animation.
- blend is used to blend animations. walk + duck = walk to duck walk. (5:00 & 9:00 & 10:20: youtube /watch?v=x2kkOROZPvE)
- repeats good.
- copy paste.
- mabey good to add code to move keyframe point in nlastrip tweak mode, like dopesheet editor.
13.03.16: Nla Editor vs Composer
With composers X is time. Y can have multiple modes.
Y Main
- Y is usually a sound effect, like a type of synth, for example a cat or dog sound.
- Moving the data block to the different track would change the sound of the notes.
Y Edit
- Composers usually have edit mode also, if its a MIDI, this is change the pitch of the notes.
- If its a raw sound signal, sometimes you can draw the signal.
- In this mode will not see any other data block.
NlaStrips are animation keyframes in a block.
Nla Editor in Main mode doesnt require an Y property.
- Sometimmes you may want to overlap animations or just move them about.
- So its better to keep it free from Y.
- Though it shouldnt be ruled out, mabey it code have different Main_modes.
13.03.16: NlaTest
I made two NlaStrips by by adding keyingsets then pressing freeze to turn them into NlaStrips.
Then i duplicated them.
NlaTracks
- NlaTrack
- NlaTrack.001
- NlaTrack.002
- NlaTrack.003
NlaStrips
- A
- A.001
- A.002
- A.003
- A..
- B
- B.001
- B.002
- B.003
- B..
Actions
- CubeAction
- CubeAction.001
Actions are the keyframes.
Transitional strips to process outer keyframes.
13.03.20: NlaStrips
The NlaStrips have Actions.
NlaTrack > NlaStrip > Action > Keyframes
When you duplicate the Strip it uses the same action.
To edit the keyframes of a NlaStrip enter Tweak Mode (TAB).
If you modify the action keyframes of one strip the other strips are modified.
13.03.20: Sync Action Length
You can sync the NlaStrip length with: Header: Edit: Sync Action Length.
This will set strip length for the strips selected.
13.03.20: copy set new NlaStrip Action
Make a NlaStrip Action unique (copy set).
- Properties: Animation Data: Brows Action to be linked.
- select the action you want to copy.
- this will add the action.keyframes to the timeline.
- press Properties: Animation Data: [+].
- this will make a new action with the same keyframes.
- press snowflake.
13.03.20: no track
13.03.20: auto sync length
auto sync length
- bool switch: auto sync length.
- bool switch: sync all strips with same action.
- problems with strips being to big.
bool switch: auto sync length.
comes with problems.
after editing if the strip maybe too big.
so two options, jump track, or be passive, this would be a bool switch.
if passive the track would be processed like an overlapping action.
13.03.20: stack interpolation
i think this is how to process multiple propeties.
this would be after each fcurve interpolation.
13.03.20: Blend
Not sure about this yet.
This is when keyframes Blend/interpolation.
Automaticly setup when NlaStrips overlap.
When blend is used on an NlaStrip, the NlaTrack becomes dominate.
So the next strip must be on the same track (mabey loop bug).
13.03.22: mesh blend
NLA Editor: Properties: Active Strip
Extrapolation and Blend, this is for mesh blending.
By default its on Replace.
Add will usually make the mesh bigger because there are two meshes it add them together.
Subtract will shrink the mesh.
Playback Settings:
Reversed, will play the strip backwards.
13.03.22: blend
lets say im auto blending these.
[ cube up ] bottom_left to bottom_right.
[cuberight] bottom_right to top_right.
with [ cube up ] blend starts at bottom and goes to top. 0 - 1.
with [cuberight] blend starts at top and goes to bottom. 1 - 0.
the auto blend creates a curve motion.
13.03.22: blend replace
move
- 2 keyframes
- Time 00.00 - 20.00
- X Location 0.0 - 5.0
- Y Location 0.0 - 0.0
- Z Location 0.0 - 0.0
- Auto Blend In/Out: off
- Blend In: 0.000
- Blend Out: 0.000
top
- 2 keyframes
- Time 05.00 - 15.00
- Z location 3.0 - 3.0
- Auto Blend In/Out: off
- Blend In: 5.000
- Blend Out: 5.000
time
- at time 0, 'move' has 1.0 influence.
- at time 5, 'top' starts to blend in.
- at time 10, 'top' replaces 'move'. 'top' has 1.0 influence, 'move' has 0.0 influence.
- at time 15, 'top' blends out and 'move' has 1.0 influence.
13.03.22: tweak blend tab
the nlastrip_action and nla_blend tabs would be shown in tweak mode (TAB).
nla00: the tracks would show strips for all objects in the scene.
with this one, be easier to change strip object.
nla01: object seperated version.
13.03.24: Auto blend
These work good.
The second one, 'left' is blending 'right' and 'right.001' at the same time.
:::::::: code ::::::::
13.03.16: c data
Note that keyframes and drivers are Fcurves (AnimData.drivers).
- Fcurves have a funny IO using ChannelDrivers and rna_path.
- BezTriple is the keyframe array.
Heres some branches not all.
---------------------------------------------------------------- AnimData bAction *action; // bAction action /* active action - acts as the 'tweaking track' for the NLA */ /* temp-storage for the 'real' active action (i.e. the one used before the tweaking-action */ /* took over to be edited in the Animation Editors) */ bAction *tmpact; // bAction temp action ListBase nla_tracks; // NlaTracks tracks /* nla-tracks */ NlaStrip *actstrip; // NlaStrip strip /* active NLA-strip (only set/used during tweaking, so no need to worry about dangling pointers) */ bAction ListBase curves; // FCurve curves /* function-curves (FCurve) */ ListBase groups; // bActionGroup groups /* groups of function-curves (bActionGroup) */ NlaTrack struct NlaTrack *next, *prev; // NlaTrack* next, prev ListBase strips; // bActionStrips strips /* bActionStrips in this track */ char name[64]; // char name NlaStrip struct NlaStrip *next, *prev; // NlaStrip* next, prev ListBase strips; // (NlaStrip,bActionStrips) strips /* 'Child' strips (used for 'meta' strips) */ bAction *act; // bAction* act /* Action that is referenced by this strip (strip is 'user' of the action) */ ListBase fcurves; // FCurve fcurves /* F-Curves for controlling this strip's influence and timing */ // TODO: move out? char name[64]; // char name /* User-Visible Identifier for Strip */ float influence; // float influence /* Influence of strip */ float strip_time; // float strip_time /* Current 'time' within action being used (automatically evaluated, but can be overridden) */ float start, end; // float start, end /* extents of the strip */ float actstart, actend; // float actstart, actend /* range of the action to use */ float repeat; // float repeat /* The number of times to repeat the action range (only when no F-Curves) */ float scale; // float scale /* The amount the action range is scaled by (only when no F-Curves) */ float blendin, blendout; // float blendin, blendout /* strip blending length (only used when there are no F-Curves) */ short blendmode; // short blendmode /* strip blending mode (layer-based mixing) */ ----------------------------------------------------------------
---------------------------------------------------------------- source/blender/makesdna/DNA_anim_types.h FModifier FMod_Generator FMod_FunctionGenerator FCM_EnvelopeData FMod_Envelope FMod_Cycles FMod_Python FMod_Limits FMod_Noise FMod_Stepped DriverTarget DriverVar ChannelDriver FPoint FCurve AnimMapPair AnimMapper NlaStrip NlaTrack KS_Path KeyingSet AnimOverride AnimData IdAdtTemplate source/blender/makesdna/DNA_action_types.h bMotionPathVert bMotionPath bAnimVizSettings bPoseChannel bPose bIKParam bItasc bActionGroup bAction bDopeSheet SpaceAction bActionChannel ----------------------------------------------------------------
Python
---------------------------------------------------------------- bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack']. bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A.002']. -------- >>> bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A.002'].action bpy.data.actions['CubeAction'] >>> bpy.data.actions['CubeAction'].fcurves[0].color Color((0.0, 0.0, 0.0)) >>> bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].co Vector((7.0, -3.0)) >>> bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].handle_left Vector((2.05462646484375, -3.0)) >>> bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].handle_right Vector((11.94537353515625, -3.0)) -------- 'CubeAction' has 3 keyframes. >>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[0].co Vector((7.0, 0.0)) >>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[1].co Vector((20.0, 0.0)) >>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[2].co Vector((59.0, 0.0)) >>> bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[3].co Traceback (most recent call last): File "<blender_console>", line 1, in <module> IndexError: bpy_prop_collection[index]: index 3 out of range, size 3 ----------------------------------------------------------------
13.03.19: python data
---------------------------------------------------------------- objects nla_tracks strips action group channels keyframe_points action group channels keyframe_points ---------------------------------------------------------------- ---------------------------------------------------------------- # object track strip action >>> bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A'].action bpy.data.actions['CubeAction'] # first keyframe position >>> bpy.data.actions['CubeAction'].frame_range[0] 7.0 # last keyframe position >>> bpy.data.actions['CubeAction'].frame_range[1] 59.0 # channels >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8] bpy.data.actions['CubeAction.002']...FCurve channels are keying sets like LocRotScale so channel[8] is 'Z Scale' # type >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].type 'KEYFRAME' # keyframe extrapolation >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].extrapolation 'CONSTANT' # keyframe points >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1] bpy.data.actions['CubeAction.002']...Keyframe # point interpolation >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].interpolation 'BEZIER' # point position >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].co Vector((221.0, 1.0)) # point handle left >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].handle_left Vector((202.65066528320312, 1.0)) # point handle right >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].handle_right Vector((239.34933471679688, 1.0)) # point selected >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].select_control_point True # point handle selected >>> bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].select_left_handle True ----------------------------------------------------------------
13.03.19: c operators
// space_ops.c ---------------------------------------------------------------- /* view */ NLA_OT_properties /* channels */ NLA_OT_channels_click NLA_OT_tracks_add NLA_OT_delete_tracks /* select */ NLA_OT_click_select NLA_OT_select_border NLA_OT_select_all_toggle NLA_OT_select_leftright /* view */ NLA_OT_view_all NLA_OT_view_selected /* edit */ NLA_OT_tweakmode_enter NLA_OT_tweakmode_exit // nla_edit.c ot->exec = nlaedit_disable_tweakmode_exec; // nla_edit.c ot->poll = nlaop_poll_tweakmode_on; // nla_edit.c NLA_OT_actionclip_add NLA_OT_transition_add NLA_OT_soundclip_add NLA_OT_meta_add NLA_OT_meta_remove NLA_OT_duplicate // nla_edit.c ot->exec = nlaedit_duplicate_exec; // nla_edit.c ot->poll = nlaop_poll_tweakmode_off; // nla_edit.c NLA_OT_delete NLA_OT_split NLA_OT_mute_toggle NLA_OT_swap NLA_OT_move_up NLA_OT_move_down NLA_OT_action_sync_length // nla_edit.c ot->exec = nlaedit_sync_actlen_exec; // nla_edit.c ot->poll = ED_operator_nla_active; // nla_edit.c NLA_OT_apply_scale NLA_OT_clear_scale NLA_OT_snap NLA_OT_fmodifier_add NLA_OT_fmodifier_copy NLA_OT_fmodifier_paste ----------------------------------------------------------------