Animation Editor: Nodes – Arma Reforger

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "ize " to "ise ")
(Update to 1.2.1)
 
Line 1: Line 1:
{{TOC|side}}
{{TOC|side}}
An '''animation node''' is a fundamental block of an animation engine. Each node has a single (and simple) purpose. By connecting these nodes to one big hierarchy, complex behaviour can be achieved.
An '''animation node''' is a fundamental block of the animation engine. Each node has a single (and simple) purpose. By connecting these nodes to one big hierarchy, complex behaviour can be achieved.
Usually the hierarchy is organised top to bottom, connecting parent nodes to child nodes.
Usually the hierarchy is organised top to bottom, connecting parent nodes to child nodes.


Line 13: Line 13:
Imagine the evaluation as a process happening in two phases.
Imagine the evaluation as a process happening in two phases.


'''DOWN.''' Animator and character programmer agree on "master" (main, topmost) node. The animation graph evaluation starts at this node and continues to child nodes.
'''DOWN'''. Animator and character programmer agree on "master" (main, topmost) node. The animation graph evaluation starts at this node and continues to child nodes.
Logic in animation nodes affects which child paths are evaluated and which are ignored. This way the evaluation traverses from topmost node to bottom of the graph.
Logic in animation nodes affects which child paths are evaluated and which are ignored. This way the evaluation traverses from topmost node to bottom of the graph.


'''UP.''' Once there are no valid child nodes where to continue the search, the evaluation returns back, carrying an animation pose as a result.
'''UP'''. Once there are no valid child nodes where to continue the search, the evaluation returns back, carrying an animation pose as a result.
This pose can be blended with other poses returned from different child paths or for example.
This pose can be blended with other poses returned from different child paths or for example.


('''SIMPLIFIED.''' Logic is evaluated from top to bottom, left to right. Results (animation poses) are passed to parent node until they reach the topmost node.)
('''SIMPLIFIED'''. Logic is evaluated from top to bottom, left to right. Results (animation poses) are passed to parent node until they reach the topmost node.)


'''Order of evaluation is important, because it affects values used in conditions and other expressions'''.
'''Order of evaluation is important, because it affects values used in conditions and other expressions'''.
Line 54: Line 54:
|}
|}


=== Source InLoopOut ===
=== Attachment ===


Used to play animations. Samples a pose from the linked animation. This pose is passed to parent node as a result.
==== Attachment ====
Attachment node provides dynamic link to a different graph using different animation instance.
The attachment is provided by the game and attachment node picks it by the binding name.
Attachments can be inserted for debugging in the animation editor through Attachments Debug window.
Attachment node translates the inputs (graph variables, commands...) into form accepted by attached graph which may influence the performance.


Animation is composed of three parts.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Binding
| Binding name of the attachment.
|}


* Intro
=== Blend ===
* Loop (surrounded by '''In Event''' and '''Out Event''')
* Outro


Loop part keeps repeating until a condition is satisfied.
==== Blend ====
Used to blend between two child nodes. Blend node supports both "normal" and "additive" blending and required no further setup for that manner, since every animation track already contains information whether it is additive. Blending is immediate - based on a value or variables. Blending weight can change rapidly between frames, no time-based blending is done.


{| class="wikitable"
{| class="wikitable"
Line 70: Line 85:
! Description
! Description
|-
|-
| '''Source'''
| Tags
| Source id selecting an animation from Anim Set ('''{{Color|blue|Group}}.{{Color|green|Column}}.{{Color|darkorange|Line}}''' or '''{{Color|blue|Group}}.{{Color|darkorange|Line}}''' when relying on a Group Select node)
| Tags set to animation output.
|-
|-
| '''In Event'''
| NodeGroup
| Marks the start of the loop
| Name of parent node group, visual and logical aid.
|-
|-
| '''Out Event'''
| BlendWeight
| Marks the end of the loop
| Blending weight (0 - 1).
|-
|-
| '''End Expr'''
| Child0
| Condition which interrupts the loop and continues to ''outro''.
| First child, having 100% influence when blending weight is 0.
|-
| Child1
| Second child, having 100% influence when blending weight is 1.
|-
| BlendFn
| Blend weight shaping (linear, s-curve, etc.).
|-
| MotionVectors
| Option specifying where to accept root motion from. 'Both' blends root motion vectors from both children.
|-
| IkTargets
| Behavior of IK targets blending
|-
| Optimization
| Optimization may turn off evaluation of child nodes which have 0% influence.
|-
| SelectMainPath
| When enabled, only the path with weight over 0.5 is marked as a main path.
|}
|}


=== Source ===
==== Blend N ====
Blend node N allows mixing results from multiple child nodes, each child node corresponds to one threshold value. Can be useful for example when blending between different directions of walking animations (0-360). Blending is immediate - based on a value or variables. Blending weight can change rapidly between frames, no time-based blending is done.
 
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| BlendWeight
| Value which controls the blending between two surrounding thresholds.
|-
| BlendFn
| Blend weight shaping (linear, s-curve, etc.)
|-
| Thresholds
| Each child node corresponds to one threshold, thresholds must go from lower to higher values.
|-
| Children
| Links to child nodes.
|-
| IsCyclic
| Enable cyclic behavior (first threshold is identical to last, even with different values). Tick and add another Threshold at the end of Thresholds that corresponds to the first Input Link (for example, threshold would be -180,-90,0,90,180 when doing directional animations)
|-
| SelectMainPath
| When enabled, only the path with weight over 0.5 is marked as a main path.
|}


Used to play animations. Samples a pose from the linked animation. This pose is passed to parent node as a result.
==== Blend T ====
Provides blending between two child nodes over time. When a condition is met, Blend T starts blending towards the other child node over time.


{| class="wikitable"
{| class="wikitable"
Line 91: Line 155:
! Description
! Description
|-
|-
| '''Source'''
| Tags
| Source id selecting an animation from Anim Set ('''{{Color|blue|Group}}.{{Color|green|Column}}.{{Color|darkorange|Line}}''' or '''{{Color|blue|Group}}.{{Color|darkorange|Line}}''' when relying on a Group Select node)
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| BlendTime
| Full blending time in seconds.
|-
| BlendFn
| Blend weight shaping (linear, s-curve, etc.).
|-
| TriggerOn
| Condition to start blending into secondary branch (if filled in, 'Condition' is ignored).
|-
| TriggerOff
| Condition to start blending back into primary branch (if filled in, 'Condition' is ignored).
|-
| Condition
| Condition to switch between primary and secondary branch.
|-
| Child0
| Primary child node
|-
| Child1
| Secondary child node
|-
| Optimization
| Select when to evaluate child nodes.
|-
| SelectMainPath
| When enabled, only the path with weight over 0.5 is marked as a main path.
|-
| PostEval
| If post-eval is checked, triggers or condition are evaluated after child nodes.
|-
|-
| '''Loop'''
| IkTargets
| loop: Loops the animation
| Behavior of IK targets blending
|}


noloop: Doesn't loop the animation
==== Blend T Add ====
Similarly to Blend T, this node provides blending over time, primary path always keeps playing as a main path. Useful for additive blending.
 
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| BlendTime
| Full blending time in seconds.
|-
| BlendFn
| Blend weight shaping (linear, s-curve, etc.).
|-
| TriggerOn
| Condition to start blending into secondary branch (if filled in, 'Condition' is ignored).
|-
| TriggerOff
| Condition to start blending out of secondary branch (if filled in, 'Condition' is ignored).
|-
| Condition
| Condition to switch between primary and secondary branch.
|-
| Child0
| Primary child node
|-
| Child1
| Secondary child node
|-
| AdditiveAlways
| When enabled, secondary child node is always evaluated regarless its current weight.
|}
|}


=== Source Sync ===
==== Blend TW ====
 
Time dependent blend between two child nodes. Unlike BlendT which utilizes thresholds, Blend TW blends towards target value.
Used to play synced animations. Samples a pose from the linked animation. This pose is passed to parent node as a result. Normalised times are used for synchronization, read more in [[Arma Reforger:Animation Editor: Sync Tutorial|Animation Editor: Sync Tutorial]].


{| class="wikitable"
{| class="wikitable"
Line 108: Line 240:
! Description
! Description
|-
|-
| '''Source'''
| Tags
| Source id selecting an animation from Anim Set ('''{{Color|blue|Group}}.{{Color|green|Column}}.{{Color|darkorange|Line}}''' or '''{{Color|blue|Group}}.{{Color|darkorange|Line}}''' when relying on a Group Select node)
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| TargetWeight
| Target blending value, reached over time.
|-
| BlendTime
| Time to reach target weight = 1 all the way from 0.
|-
| BlendFn
| Blend weight shaping (linear, s-curve, etc.).
|-
|-
| '''Loop'''
| BlendTimeFn
| loop: Loops the animation
| Shaping of difference between target and current weight
noloop: Doesn't loop the animation
|-
|-
| '''Sync'''
| Child0
| See [[Arma Reforger:Animation Editor: Sync Tutorial|Animation Editor: Sync Tutorial]].
| First child, having 100% influence when blending weight is 0.
|-
| Child1
| Second child, having 100% influence when blending weight is 1.
|-
| Optimization
| Optimization may turn off evaluation of child nodes which have 0% influence.
|-
| SelectMainPath
| When enabled, only the path with weight over 0.5 is marked as a main path.
|-
| IkTargets
| Behavior of IK targets blending
|-
| OptimizeMin
| When set to true and blending weight is zero, second child node is not evaluated
|-
| OptimizeMax
| When set to true and blending weight is one, first child node is not evaluated
|}
|}


=== Pose ===
==== Queue ====
Supports enqueuing and playing secondary child nodes and blending them with primary path.
This can be used for both additive and full body animations, where the full body will override the main link, and the additive animation will play on top of the main link.


Used to sample a pose from an animation. Unlike '''Source''' node, '''Pose''' node does not play the animation. Animation frame is computed from variables.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Primary child node, always evaluated regardless queued actions.
|-
| QueueItems
| List of queue items which can be played as secondary actions.


'''Pose''' node can blend between two closest frames when the variable value falls between them.
* '''AnimSrcNodeQueueItem'''
: {| class="wikitable"
! Property
! Description
|-
| Child
| Child node of queue item.
|-
| StartExpr
| Condition to start playing this item
|-
| InterruptExpr
| Optional condition to interrupt this item
|-
| StartTime
| Optional starting time
|-
| BlendInTime
| Time to fully blend in
|-
| BlendOutTime
| Time to fully blend out
|-
| EnqueueMethod
| Behavior of item start - select if it is allowed to interrupt other items or self.
|-
| TagMainPath
| When this item is playing, this tag is set on the primary path of the queue node.
|-
| CacheOnEnqueue
| List of cached variable values and commands, frozen during enqueuing and passed unchanged to this playing item.
* '''AnimSrcVarCmdTempStorage'''
: {| class="wikitable"
! Property
! Description
|-
| Variables
| ''No description''
|-
| Commands
| ''No description''
|}
|}
|-
| IkTargets
| Behavior of IK targets blending
|}


'''Example usage:''' steering in a vehicle, having all steering poses in one animation and using a variable to select a pose to be played'''.'''
==== Switch ====
Plays child nodes and switches to next one randomly, once they finish playing.


{| class="wikitable"
{| class="wikitable"
Line 131: Line 355:
! Description
! Description
|-
|-
| '''Source'''
| Tags
| Source id selecting an animation from Anim Set ('''{{Color|blue|Group}}.{{Color|green|Column}}.{{Color|darkorange|Line}}''' or '''{{Color|blue|Group}}.{{Color|darkorange|Line}}''' when relying on a Group Select node)
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| BlendTime
| Transition time between child nodes.
|-
| FirstProbabilities
| List of numbers separated by commas or spaces, representing probability per node.
|-
| SwitchItems
| List of child nodes and their probability tables.
 
* '''AnimSrcNodeSwitchItem'''
: {| class="wikitable"
! Property
! Description
|-
| Child
| Link to child node
|-
|-
| '''Time'''
| NextProbabilities
| 0 to 1, where 0 maps to the first frame of animation, and 1 maps to the last frame of animation
| List of numbers separated by commas or spaces, representing probability per node.
|}
|}
|}


=== Pose 2 ===
=== Buffer ===


'''Pose 2''' node is similar to '''Pose''' node, but it works in two dimensional space.
==== Buffer Save ====
Saves contents of current pose buffer in the node to named temporary storage.


{{Feature|informative|See [[Arma Reforger:Animation Editor: Pose 2D Node Tutorial|Animation Editor: Pose 2D Node Tutorial]].}}
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| BufferName
| Storage name
|-
| BoneMask
| Inclusive mask restricting saved bones. If no mask is selected, all bones are saved.
|}


'''Example usage:''' Aim Spaces and Look Animations - mapping horizontal and vertical direction to a pose.
==== Buffer Use ====
Restore previously saved pose buffer from temporary storage.


{| class="wikitable"
{| class="wikitable"
Line 150: Line 415:
! Description
! Description
|-
|-
| '''Source'''
| Tags
| Source id selecting an animation from Anim Set ('''{{Color|blue|Group}}.{{Color|green|Column}}.{{Color|darkorange|Line}}''' or '''{{Color|blue|Group}}.{{Color|darkorange|Line}}''' when relying on a Group Select node)
| Tags set to animation output.
|-
|-
| '''Value Y'''
| NodeGroup
| Expression for the Y direction
| Name of parent node group, visual and logical aid.
|-
|-
| '''Value X'''
| BufferName
| Expression for the X direction
| Storage name
|-
|-
| '''Table'''
| BoneMask
| Table which maps X and Y values to frames, details '''here'''
| Inclusive mask restricting restored bones. If no mask is selected, all bones are used.
|}
|}


=== State Machine ===
==== Filter ====
Filter current pose buffer by bone mask.


'''State machines''' contain multiple '''state''' nodes and '''transitions''' between them. Only one '''state''' per '''state machine''' is active in any frame unless a transition with a '''duration''' attribute bigger than 0.0 has been fulfilled.
{| class="wikitable"
State machine tries to switch to new state on every frame, if any '''condition''' on transition is fulfilled.
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| BoneMask
| Inclusive mask restricting bones kept in the pose buffer. If no mask is selected, all bones are kept.
|-
| Condition
| Expression enabling this filter
|}


{{Feature|informative|See [[Arma Reforger:Animation Editor: State Machine|Animation Editor: State Machine]].}}
=== Ctx ===


=== Blend ===
==== Ctx Begin ====
Ctx Begin and Ctx End surround branched block of the graph, protecting subgraph below Ctx End against losing its state during branch switches the state of subgraph is bypassed and safely stored in Ctx Begin. Traversing through Ctx End is allowed only for the first branch which reaches it, other branches inside the block receive cached result.


Used to '''blend''' between two child nodes. Blend node supports both "normal" and "additive" blending and required no further setup for that manner, since every animation track already contains information whether it is additive.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node. First node in the branched block.
|}


Blending is '''immediate''' - based on a value or variables. Blending weight can change rapidly between frames, no time-based blending is done.
==== Ctx End ====
Ctx Begin and Ctx End surround branched block of the graph, protecting subgraph below Ctx End against losing its state during branch switches the state of subgraph is bypassed and safely stored in Ctx Begin. Traversing through Ctx End is allowed only for the first branch which reaches it, other branches inside the block receive cached result.


{| class="wikitable"
{| class="wikitable"
Line 180: Line 477:
! Description
! Description
|-
|-
| '''Weight'''
| Tags
| Expression (0.0 - 1.0)
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node. Subgraph below the branched block of the graph.
|}


0: 100% 1st child
=== Event ===


0.5: 50% 1st, 50% 2nd child
==== Event ====
Fires animation events when the node is activated or condition is fulfilled.
This is useful when we need to signal other parts of engine or game code that a branch in animation graph became active (for example, audio engine can react to stance changes).


1: 100% 2nd child
{| class="wikitable"
 
! Property
If this needs to be dynamic and controllable, create a float variable and use it in this expression.
! Description
 
|-
For example
| Tags
or even bit more complicated usage is possible
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node.
|-
| Events
| List of events and their conditions
* AnimSrcEvent
: {| class="wikitable"
! Property
! Description
|-
| Name
| Event identifier
|-
| Comment
| Any explaining messages belong here. Ignored in runtime.
|-
| MainPathOnly
| When enabled, event is sampled only on main path
|-
| InitOnly
| Event is sampled just on node init (Event Node only)
|-
| Condition
| When filled in, event is sampled only if this condition results true. (Event Node only)
|-
| Once
| When enabled, this events triggers only on first frame the condition is valid.
Re-trigger is possible only after a frame the condition evaluates to false (Event Node only).
|-
| Frame
| Frame number of the event start (Animation only)
|-
| FrameCount
| Duration of the event (Animation only)
|}
* '''AnimSrcEventGeneric''' : AnimSrcEvent
: {| class="wikitable"
! Property
! Description
|-
| UserString
| Additional string attribute
|-
|-
| '''Optimise Min/Max'''
| UserInt
| If '''Min''' is unticked, '''1st Node''' will always play
| Additional integer attribute
|}
* '''AnimSrcEventAudio''' : AnimSrcEvent
|}


If '''Max''' is unticked, '''2nd Node''' will always play
=== Function ===


This also makes the unchecked side multiplied,
==== Function Begin ====
Function Begin and Function end surround graph block which can be called (reused) on multiple other places.


so a '''2''' will make '''2nd Node''' play multiplied
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node. First node inside the function block.
|-
| EndsCount
| Number of function end points (FunctionEnd nodes)
|}


(as '''1''' is maximum, normally)
==== Function Call ====
Redirects evaluation into a function - a block of nodes starting with Function Begin. After the evaluation inside the block reaches any Function End, evaluation resumes at this place.


'''Note:''' If the main pose is set as '''1st Node''' and an additive animation as '''2nd Node,''' simply untick '''Optimise Max''' and set '''Weight''' to '''1.0'''.
{| class="wikitable"
 
! Property
This will always play the main pose, but additively play the second node.
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Method
| Function name (Function Begin node name)
|-
| Child0
| ''No description''
|-
| Child1
| ''No description''
|-
| Child2
| ''No description''
|-
| Child3
| ''No description''
|-
| Child4
| ''No description''
|-
| Child5
| ''No description''
|-
| Child6
| ''No description''
|-
| Child7
| ''No description''
|}
|}


=== Blend N ===
==== Function End ====
Function Begin and Function end surround graph block which can be called (reused) on multiple other places.


Used when blending between multiple child nodes. Each child node corresponds to one threshold value.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| EndIndex
| Index of a following child node at call site.
|}


Can be useful for example when blending between different directions of walking animations (0-360).
=== Group Select ===


Blending is '''immediate''' - based on a value or variables. Blending weight can change rapidly between frames, no time-based blending is done.
==== Group Select ====
Selects an active column in anim set group. Animation and constants identifiers may then omit column name because it is selected by this node.
Example: Group select node selects column "Erc" in group "Locomotion".
Source node below refers to animation "Locomotion.Walk" but active column is filled in, resulting in unique animation identifier "Locomotion.Erc.Walk".


{| class="wikitable"
{| class="wikitable"
Line 222: Line 643:
! Description
! Description
|-
|-
| '''Blend Weight'''
| Tags
| Expression. Value which controls the blending between two thresholds (=two child nodes).
| Tags set to animation output.
|-
|-
| '''Blend Fn'''
| NodeGroup
| Shape of blending curves between particular thresholds. Use '''Lin''' in order to avoid curves.
| Name of parent node group, visual and logical aid.
|-
|-
| '''Is Cyclic'''
| Child
| Enable cyclic behavior (first threshold is identical to last, even with different values). Tick and add another '''Threshold''' at the end of '''Thresholds'''
| Link to child node
that corresponds to the first '''Input Link''' (for example, threshold would be -180,-90,0,90,180 when doing directional animations)
|-
|-
| '''Children'''
| Group
| Links to child nodes.
| Anim set group containing the column
|-
|-
| '''Thresholds'''
| Column
| Each child nodes corresponds to one threshold, thresholds must go from lower to higher values.
| Anim set column within the group to be selected
|}
|}


=== Blend T ===
=== IK ===
=== Blend T Add ===


Used to '''blend''' between two child nodes '''over time''' - unlike other blend nodes. When a condition is met, '''Blend T''' starts blending towards the other child node over time.
==== IK2 ====
 
Node which applies inverse kinematics on a chain of bones to reach a specific target.
'''Blend T''' '''Add''' always plays the main child node and the second child pose is blended with it. '''Condition''' in '''Blend T''' '''Add''' is always '''evaluated after main''' child node but before '''second child''' node.


{| class="wikitable"
{| class="wikitable"
Line 250: Line 668:
! Description
! Description
|-
|-
| '''Blend Time'''
| Tags
| Blending time between child nodes in seconds.
| Tags set to animation output.
|-
|-
| '''Blend Fn'''
| NodeGroup
| Shape of blending curves between particular thresholds. Use '''Lin''' in order to avoid curves.
| Name of parent node group, visual and logical aid.
|-
|-
| '''Trigger OnTrigger Off'''
| Child
| '''Trigger On''' switches from first to second, '''Trigger Off''' switches back to first. Both have to be filled, otherwise '''Condition''' is used.
| Link to child node
|-
|-
| '''Condition'''
| Weight
| If Triggers are empty, condition serves as a switch between child nodes. When false, first child node is active, when false, second child node is active.
| Weight (0-1). When zero, no IK is applied, when one, IK is fully applied.
|-
|-
| '''Post Eval'''
| Chains
| If '''Post-Eval''' is set to true, triggers or conditions are evaluated after child nodes. This is required when expressions refer to tags or events returned by child nodes.
| List of chains and their IK targets.


'''Condition''' in '''Blend T''' '''Add''' is always '''evaluated after main''' child node but '''before second''' child node.
* '''AnimSrcIkBinding'''
: {| class="wikitable"
! Property
! Description
|-
| IkTarget
| IK target name
|-
| IkChain
| IK chain name
|}
|}
|-
| Solver
| Select an instance of IK solver to run.


=== Group Select ===
* '''AnimSrcNodeIK2Solver'''
* '''AnimSrcNodeIK2FabrikSolver''' : AnimSrcNodeIK2Solver<br>Iterative solver with basic rotation limits.
: {| class="wikitable"
! Property
! Description
|-
| SnapRotation
| Snap rotation of end effector to align with IK target.
|-
| RotationLimitPerBone
| Maximum rotation [degrees] applied per bone in chain
|-
| TightenToTarget
| Percentage of chain where rotation limit tightens to zero
|-
| TwistPropagation
| Percentage of chain receiving twist from the snapped rotation
|-
| MaxIterations
| Maximum number of iterations when the solver stops even if the target is not reached
|}
* '''AnimSrcNodeIK2TwoBoneSolver''' : AnimSrcNodeIK2Solver<br>Analytic two-bone solution. If the chain contains more than two bones, it is split into two segments by its mid-joint.
: {| class="wikitable"
! Property
! Description
|-
| SnapRotation
| Snap rotation of end effector to align with IK target.
|-
| AllowStretching
| Allow chain stretching when the IK target is out of reach.
|-
| MidPivotTwist
| Additional twist of mid pivot plane in radians.
|}
* '''AnimSrcNodeIK2LookAtSolver''' : AnimSrcNodeIK2Solver<br>Solver which rotates the chain that its end effector is facing the target.
: {| class="wikitable"
! Property
! Description
|-
| Axis
| Axis to aim at target.
|}
* '''AnimSrcNodeIK2LookInDirSolver''' : AnimSrcNodeIK2Solver<br>Solver which rotates the chain that its end effector is aligned with selected axis of the target.
: {| class="wikitable"
! Property
! Description
|-
| Axis
| Axis to aim in target's direction.
|-
| TargetAxis
| Target axis chosen as its direction.
|}
* '''AnimSrcNodeIK2PoleSolver''' : AnimSrcNodeIK2Solver<br>Solver rotating around twist axis, aligning mid-joint with the target.
|}


Used to select a '''{{Color|green|Column}}''' in a '''{{Color|blue|Group}}''' in '''Anim Set'''. If any '''Source Node''' below selects an animation by source id in following format:
==== IK2 Plane ====
Computes inverse kinematics on a chain to reach target plane. Target planes are set by application (character/gameplay programmers).


'''{{Color|blue|Locomotion}}.{{Color|green|WalkF}}'''
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| Weight
| Weight (0-1). When zero, no IK is applied, when one, IK is fully applied.
|-
| Chains
| List of chains and their IK plane targets.
* AnimSrcIkBinding
: {| class="wikitable"
! Property
! Description
|-
| IkTarget
| IK target name
|-
| IkChain
| IK chain name
|}
|-
| ActiveDistance
| Thresholding distance [m]. If the end effector is further, no IK is applied even when weight is one. In meters.
|-
| ThresholdSmoothness
| Smoothing region [m] to turn on IK continuously.
|-
| SnapRotation
| Snap the rotation of end effector to be the same as ik target rotation.
|-
| CustomNormal
| When zero, IK2 Plane pushes the end effector along the normal of plane.
In some situations it may be feasible to move it in a custom direction, for example pushing up when correcting feet by IK.
|}


Then the '''{{Color|green|Column}}''' is injected and new animation source id is formed by the '''Group Select''' between these, to form:
==== IK2 Target ====
 
Creates an ik target from model-space position of a bone or end effector of a chain.
'''{{Color|blue|Locomotion}}.{{Color|green|Erc}}.{{Color|darkorange|WalkF}}'''


{| class="wikitable"
{| class="wikitable"
Line 282: Line 809:
! Description
! Description
|-
|-
| '''Group'''
| Tags
| Defines in which anim set group the column is selected
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
|-
| '''Column'''
| Child
| Defines which column of the '''Group''' should be selected
| Link to child node
|-
| Chains
| List of ik targets to be created and assigned transform from specified chains. Additional offsets might be applied.
* '''AnimSrcIkTargetBinding'''
: {| class="wikitable"
! Property
! Description
|-
| IkTarget
| IK target name
|-
| IkChain
| Chain name
|-
| LocalSpaceOffset
| Offset applied to chain in local space (affected by parent transforms)
|}
|}
* '''AnimSrcTransformOffset'''
: {| class="wikitable"
! Property
! Description
|-
| Position
| Position offset
|-
| Rotation
| Rotation offset
|-
| Pose
| Source id of an animation pose. This pose is used to set the local offset from chain's end effector. Serves probably better than guessing transform numbers.
Note: column/group selects apply here same way as in source nodes.
Example: when we were constraining left hand to first person camera, we exported a pose with two bones in world space - head and left hand.
Then these two bones describe the offset where to place an IK target.
|-
| FromBone
| Offset is measured from bone having this name...
|-
| ToBone
| Offset is measured to bone having this name.
|-
| FromFrame
| Offset is measured from bone sampled on this frame
|-
| ToFrame
| Offset is measured to bone sampled on this frame.
|-
| BonesAreInModelSpace
| When checked, the pose is in model space and does not need to accumulate bones from local space.
|}
|-
| ModelSpaceOffset
| Offset applied to chain in model space (unaffected by parent transforms)
* '''AnimSrcTransformOffset'''
: {| class="wikitable"
! Property
! Description
|-
| Position
| Position offset
|-
| Rotation
| Rotation offset
|-
| Pose
| Source id of an animation pose. This pose is used to set the local offset from chain's end effector. Serves probably better than guessing transform numbers.
Note: column/group selects apply here same way as in source nodes.
Example: when we were constraining left hand to first person camera, we exported a pose with two bones in world space - head and left hand.
Then these two bones describe the offset where to place an IK target.
|-
| FromBone
| Offset is measured from bone having this name...
|-
| ToBone
| Offset is measured to bone having this name.
|-
| FromFrame
| Offset is measured from bone sampled on this frame
|-
| ToFrame
| Offset is measured to bone sampled on this frame.
|-
| BonesAreInModelSpace
| When checked, the pose is in model space and does not need to accumulate bones from local space.
|}
|-
| Bones
| List of ik targets to be be created and assigned transform from specified model-space transforms of bones.


=== Queue Node ===
* '''AnimSrcIkTargetBinding'''
 
: {| class="wikitable"
Queue node provides solution when queueing up animations and playing them on top of main animation, such as a gestures or other actions.
! Property
! Description
|-
| IkTarget
| IK target name
|-
| Bone
| Measured offset from bone of this name...
|}
|}


This can be used for both additive and full body animations, where the full body will override the '''main link,''' and the additive animation will play on top of the '''main link.'''
==== IK Lock ====
Animation node locking the ik target in place and applying two-bone IK solver.


{| class="wikitable"
{| class="wikitable"
Line 299: Line 925:
! Description
! Description
|-
|-
| '''Main Link'''
| Tags
| Link to "main" child node which is played (evaluated) all time
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| IsLocked
| Expression enabling the lock.
|-
| BlendinTime
| Blend time for IK to fully take over.
|-
| BlendoutTime
| Blend time for IK to be fully released.
|-
| SnapRotation
| Snap the rotation of end effector to be the same as ik target rotation.
|-
| World
| Name of world transform delta passed by the game. This can be used to lock targets onto moving ground, for example.
|-
| Chains
| List of IK targets and affected chains
* '''AnimSrcIkBinding'''
: {| class="wikitable"
! Property
! Description
|-
| IkTarget
| IK target name
|-
|-
| '''Items'''
| IkChain
| Press '''+''' to add new items, '''-''' to remove.
| IK chain name
|}
|}


Each item links to a child node and has the following properties:
==== IK Rotation ====
Animation node applying inverse kinematics to reach target rotation, local translations are untouched.
When enabled, rotation of end-effector is identical to IK target, parent bones receive a fraction of the rotation.
Useful for spine inverse kinematics instead of counter-animating hip rotations.


{| class="wikitable"
{| class="wikitable"
Line 311: Line 973:
! Description
! Description
|-
|-
| '''Start Condition'''
| Tags
| Condition to start playing this item
| Tags set to animation output.
|-
|-
| '''Interrupt condition''' (optional)
| NodeGroup
| Interrupt (stopping) condition for this item
| Name of parent node group, visual and logical aid.
|-
|-
| '''Start Time''' (optional)
| Child
| Starting time to be pushed to child node when this item becomes active
| Link to child node
|-
|-
| '''In Time'''
| Weight
| Time it takes to blend into this item (default 0.3 sec)
| Weight (0 - 1). When zero, no rotation changes are applied, when one, rotations are fully applied.
|-
|-
| '''Out Time'''
| Chains
| Time it takes to blend out of this item (default 0.3 sec)
| List of IK targets and affected chains
* '''AnimSrcIkBinding'''
: {| class="wikitable"
! Property
! Description
|-
|-
| '''Interruptible'''
| IkTarget
| Tick to make other queue items in this node
| IK target name
able to interrupt this specific item
|-
| IkChain
| IK chain name
|}
|}
|}
|}


=== Buffer Save ===
==== RBF ====
=== Buffer Use ===
''No description''


'''Buffer Save''' stores current animation buffer aside under chosen name. Stashed buffer can be used (loaded) later.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| ''No description''
|-
| Rbf
| ''No description''
|}


'''Buffer Use''' loads a stashed buffer with matching name, replacing current animation buffer.
==== Weapon IK ====
Specialized node positioning arms according to aim direction and applying 2-joint ik on arms to snap to weapon.
Algorithm: Compares current weapon direction with desired direction. Rotate weapon to correct direction. Snaps primary and secondary chain (arms) onto weapon.


This node might be slightly more complex than it seems. Please refer to the Absolute & Differential Animations and Buffer Nodes article for further details.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| IkconfigName
| Name of the Weapon IK configuration
|-
| Ikconfig
| Configuration. Exposes IK pose channels to solver. Defines primary and secondary chain and their orientation.
|-
| BlendInTime
| Blending time to fully enable 'Aim On', 'Prim On' and 'Sec On'.
|-
| BlendOutTime
| Blending time to fully disable 'Aim On', 'Prim On' and 'Sec On'.
|-
| WeightAim
| Enable aiming correction.
|-
| WeightPrimaryChain
| Enable IK on primary chain (right arm).
|-
| WeightSecondaryChain
| Enable IK on secondary chain (left arm).
|-
| WeaponDirLr
| Horizontal weapon aiming angle, used when Aim On=1
|-
| WeaponDirUd
| Vertical weapon aiming angle, used when Aim On=1
|-
| WeaponRoll
| Weapon roll, used when Aim On=1
|-
| WeaponTransX
| Additional weapon translation in model-space X direction
|-
| WeaponTransY
| Additional weapon translation in model-space Y direction
|-
| WeaponTransZ
| Additional weapon translation in model-space Z direction
|}


=== Var Update Node ===
=== Memory ===


Var Update node is able to remember values of chosen variables and can keep their values fixed for child nodes below. Updates of remembered values can be turned on/off in different situations:
==== Memory ====
Allows to save several bones into the local memory and fill them in on later frames if they are not present in pose buffer anymore.


* On Init: Update remembered values when the Var Update node becomes active
{| class="wikitable"
* On Main Path: Update remembered values when the Var Update node lies on main path (is active)
! Property
* On Blend Out: Update remembered values when blending out.
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| BoneMask
| Bone mask with a list of remembered bones
|-
| Child
| Link to child node
|}


Unticked situations keep the values fixed.
=== Procedural ===


'''Example Usage:'''
==== Constraint ====
''No description''


This node is used when are blending from one state to another that is using the same internal variable, such as direction or speed.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| Weight
| Weight of the applied constraint
|-
| Constraint
| Select a constraint to be applied
* '''AnimSrcConstraint'''
: {| class="wikitable"
! Property
! Description
|-
| AffectedBone
| Name of bone affected by the constraint. If filled in, affected IK target must remain empty.
|-
| AffectedIk
| Name of IK target affected by the constraint. If filled in, affected bone must remain empty.
|-
| TargetBone
| Target bone for the constraint solver. If filled in, target IK target must remain empty.
|-
| TargetIk
| Target IK target for the constraint solver. If filled in, target bone must remain empty.
|-
| InitPose
| Constraint can be initialized from current or bind pose.
|-
| CustomSpace
| If filled in, constraint is computed in custom space
* '''AnimSrcConstraintCustomSpace'''
: {| class="wikitable"
! Property
! Description
|-
| AffectedSpace
| ''No description''
|-
| AffectedPivotBone
| ''No description''
|-
| AffectedPivotIk
| ''No description''
|-
| TargetSpace
| ''No description''
|-
| TargetPivotBone
| ''No description''
|-
| TargetPivotIk
| ''No description''
|}
|}
* '''AnimSrcConstraintPosition''' : AnimSrcConstraint<br>Constraint which can fixate translation offset between two bones (or ik targets). The offset can also decay over time.
: {| class="wikitable"
|-
! Property
! Description
|-
| OffsetSoftLimit
| Threshold which where the limit distance starts to be applied softly. Must be less than hard limit.
|-
| OffsetHardLimit
| Maximum distance travelled from original position.
|-
| OffsetDampening
| Rate of decay from offset hard limit to offset soft limit. Zero means immediate dampening, one means no dampening.
|-
| Components
| Influence per component X, Y, Z.
|}
* '''AnimSrcConstraintParent''' : AnimSrcConstraint<br>Constraint which can fixate translation and rotation offset between two bones (or ik targets).
: {| class="wikitable"
! Property
! Description
|-
| RotateFirst
| Rotate affected around target first before resolving position.
|}
|}


Say, the character is moving towards left (-90) and wants to switch to going right (-90). Normally the Direction variable would go from -90 to 90 immediately, and the character would then do an unnatural skip between these two.
==== Procedural ====
 
AnimNodeProcTransform applies procedural transform on a set of joints or IK targets through entered expressions.
The game could gradually blend from -90 to 0 to 90, but then the character would be forced to interpolated direction for a short time.
 
This Var Update Node can bypass that by saving the old variable value (-90) to the old state and pass new variable value (90) to new state while the states are blending from one into another.
 
=== Rotation Node ===
 
'''Rotation''' node provides procedural rotation (or even translation) of bones according to expression.


{| class="wikitable"
{| class="wikitable"
Line 369: Line 1,203:
! Description
! Description
|-
|-
| '''Expression'''
| Tags
| This is the expression the node will use to evaluate the bones listed below
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| Expression
| Applied amount multiplier.
|-
| Bones
| List of operations on bones
* AnimSrcNodeProcTrBoneItem
: {| class="wikitable"
! Property
! Description
|-
| Bone
| Name of affected bone
|-
| Axis
| Translation/rotation axis
|-
| Space
| Proc transform can be done in model-space, local-space or pivot-space.
|-
| Op
| Operation to perform (translation, rotation, ...)
|-
| Amount
| Applied amount, multiplied by shared Expression in the node
|-
| PivotBone
| Pivot bone, used when operating in pivot-space
|-
| PivotIk
| Pivot IK target, used when operating in pivot-space
|}
|-
| IkTargets
| List of operations on IK targets
* '''AnimSrcNodeProcTrIkTargetItem'''
: {| class="wikitable"
! Property
! Description
|-
| IkTarget
| Name of affected IK target
|-
|-
| '''Bones'''
| Axis
| Each item affects one bone.
| Translation/rotation axis
|-
| Space
| Proc transform can be done in model-space, local-space or pivot-space.
|-
| Op
| Operation to perform (translation, rotation, ...)
|-
| Amount
| Applied amount, multiplied by shared Expression in the node
|-
| PivotBone
| Pivot bone, used when operating in pivot-space.
|-
| PivotIk
| Pivot IK target, used when operating in pivot-space
|}
|}
 
=== Sleep ===
 
==== Sleep ====
Sleep node can turn off evaluation of all its child nodes and return empty result instead, drastically saving performance.
The node goes to sleep after its awake condition is not fulfilled during entire timeout period. In an ideal case, it should be used as a starting node - when sleeping, many processes inside graph evaluation are skipped early.


{| class="wikitable"
{| class="wikitable"
Line 379: Line 1,284:
! Description
! Description
|-
|-
| '''Bone'''
| Tags
| What bone to manipulate
| Tags set to animation output.
|-
|-
| '''Axis'''
| NodeGroup
| Which axis to rotate around
| Name of parent node group, visual and logical aid.
|-
|-
| '''Space'''
| Child
| This defines which space the manipulation will happen in:
| Link to child node
 
* '''Local''' - ''Rotate in local space of a bone = use axes of the bone''
* '''Model''' - ''Rotate in a model space = use axes of character''
* '''Parent''' - ''Rotate in a space of parent bone = use axes of parent bone''
|-
|-
| '''Op'''
| AwakeExpr
| This defines what operation will be used for the manipulation:
| When false, node goes to sleep mode after a timeout, effectively turning off child nodes.
 
* '''Rotate''' - ''rotate the bone around its origin''
* '''RotateAround''' - ''not implemented (???)''
* '''Translate''' - translate the bone, o''nly local space manipulation is implemented''
|-
|-
| '''Amount'''
| Timeout
| Multiplier for the expression.
| Timeout before going to sleep mode. Awake expression resets the timeout.
 
Example: '''Amount''' is 90 and '''Expression''' goes for example from -2 to 2. Rotation of this bone then goes from -180 to 180.
|}
|}
|}


=== IK2 Target ===
=== Source ===


'''IK2 Target''' saves transforms of end effectors for later use by '''IK2''' node.
==== Bind Pose ====
Sample bind pose of the animated mesh.


{| class="wikitable"
{| class="wikitable"
Line 414: Line 1,309:
! Description
! Description
|-
|-
| '''Chains'''
| Tags
| For each chain, model space positions and rotations of their end effectors are computed. Then, end-effector transform is saved under '''Ik Target''' identifier.
| Tags set to animation output.
'''Ik Target''' can be used later in IK2 nodes.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| BoneMask
| Inclusive bone mask restricts which bones are sampled. If no mask is specified, all bones are sampled.
|}
 
==== Pose ====
Sample a pose from an animation.
Unlike Source node, Pose node does not play the animation, sampled frame is computed from an expression. Pose node blends between two closest frames when the variable value falls between them.
Example usage: steering in a vehicle, having all steering poses in one animation and using a variable to select a pose to be played


{| class="wikitable"
{| class="wikitable"
Line 422: Line 1,328:
! Description
! Description
|-
|-
| '''Ik Target'''
| Tags
| identifier of transform
| Tags set to animation output.
|-
|-
| '''Ik Chain'''
| NodeGroup
| Selects the chain of bones (chains are defined for entire graph in anim workspace).
| Name of parent node group, visual and logical aid.
 
Position and rotation are set from current transform of end effector of this chain. Additional offsets are applied (see below).
|-
|-
| '''Parent Offset Pos'''
| Source
| Offset applied to chain in model space (parent to chain, not affected by chain hierarchy)
| Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
|-
|-
| '''Target Offset Pose'''
| Time
| Source id of an animation pose. This pose is used to set the local offset from chain's end effector. Serves probably better than guessing transform numbers.
| Normalized sampling time (0 - 1)
|}


Note: column/group selects apply here same way as in source nodes.
==== Pose 2 ====
Samples a pose from an animation based on control expressions and 2D table.
Similar to plain Pose node, but it works in two-dimensional space.
Example usage: Aim Spaces and Look Animations - mapping horizontal and vertical direction to a pose.


Example: constraining the left hand to first person camera, a pose with two bones in world space got exported - bones were head and left hand.
{| class="wikitable"
These two bones then describe the offset where to place an IK target.
! Property
! Description
|-
|-
| '''Target Offset Pose''' '''From Bone'''
| Tags
| Measured offset from bone of this name...
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
|-
| '''Target Offset Pose''' '''To Bone'''
| Source
| ...to bone of this name.
| Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
|-
|-
| '''Target Offset Pose''' '''In Model Space'''
| ValueX
| When checked, the pose is in model space and does not need to accumulate bones from local space. When possible, try to have this turned on, it helps performance.
| Expression for the X coordinate
|-
|-
| '''Target Offset Pos'''
| ValueY
| Child offset applied to end effector of chain (this offset is affected by chain hierarchy)
| Expression for the Y coordinate
|-
|-
| '''Target Offset Rot'''
| Table
| Rotation offset applied to end effector of chain, in euler angles (this offset is affected by chain hierarchy)
| Table remapping X and Y coord to frames
|}
|}
|}


=== IK2 ===
==== Source ====
 
Plays an animation from anim set. Playback can be looped.
'''IK2''' computes inverse kinematics on a chain of bones to reach a specific '''target'''.


{| class="wikitable"
{| class="wikitable"
Line 466: Line 1,376:
! Description
! Description
|-
|-
| '''Weight'''
| Tags
| Weight, 0-1. When zero, no IK is applied, when one, IK is fully applied.
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Source
| Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
|-
| Looptype
| Enables looped playback.
|-
|-
| '''Snap Rotation'''
| Interpolate
| Snap the rotation of end effector to be the same as ik target rotation.
| When enabled, keyframes are interpolated during playback.
|-
|-
| '''Chains'''
| Predictions
| List of chains and their IK targets.
| List of sampled predictions (future bone transforms in the animation)


{| class="wikitable"
* AnimSrcNodePrediction
: {| class="wikitable"
! Property
! Property
! Description
! Description
|-
|-
| '''Ik Target'''
| Name
| identifier of target transform, supplied by '''IK2 Target''' or by game code
| Prediction name
|-
| Bone
| Name of channel to be sampled.
|-
| Event
| Bind the time of this prediction to an event with matching name.
|-
| PercentTime
| Normalized time of the prediction [0 - 1].
|-
|-
| '''Ik Chain'''
| Translation
| selects the chain of bones (chains are defined for entire graph in anim workspace)
| Select when translation should be sampled.
|-
| Rotation
| Select when rotation should be sampled.
|-
| MainPath
| Select when the prediction should be sampled only on graph's main path.
|}
|}
|-
| BonesInterpolatedInModelSpace
| List of bones interpolated in model-space, which be required to prevent stutters caused by inheriting all interpolations in hierarchy.
|-
| ReportDistance
| Using root motion channel, report sample distance travelled until end of cycle (when looped) or animation (when unlooped).
|}
|}


=== IK2 Plane ===
==== Source InLoopOut ====
 
Plays an animation from anim set. The animation is divided by events into three segments: intro, loop, outro. Playback leaves the looped region only a condition is fulfilled.
'''IK2''' computes inverse kinematics on a chain of bones to reach a specific '''target plane.''' Target planes are set by application (character/gameplay programmers).


{| class="wikitable"
{| class="wikitable"
Line 495: Line 1,435:
! Description
! Description
|-
|-
| '''Weight'''
| Tags
| Weight, 0-1. When zero, no IK is applied, when one, IK is fully applied.
| Tags set to animation output.
|-
|-
| '''Active Distance'''
| NodeGroup
| Distance which the IK is applied from. If the chain of bones is further, no IK is applied even when weight is one. In meters.
| Name of parent node group, visual and logical aid.
|-
|-
| '''Threshold smoothness'''
| Source
| Smoothing the "edge" of active distance to turn on IK continuously. In meters.
| Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
|-
|-
| '''Custom Rotation'''
| InEvent
| When zero, IK2 Plane pushes the end effector along the normal of plane. In some situations it may be feasible to move it in a custom direction, for example pushing up when correcting feet by IK.
| Name of event marking the end of intro and start of looped region.
|-
|-
| '''Snap Rotation'''
| OutEvent
| Snap the rotation of end effector to be the same as ik target rotation.
| Name of event marking the end of looped region and start of outro.
|-
|-
| '''Chains'''
| EndExpression
| List of chains and their IK targets.
| If the expression results in true, further looping is disabled, allowing playback to reach the end.
|}
 
==== Source Sync ====
Plays an animation from anim set using normalized time. Playback can be looped.
 
{| class="wikitable"
{| class="wikitable"
! Property
! Property
! Description
! Description
|-
|-
| '''Ik Target'''
| Tags
| identifier of target transform, supplied by game code
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
|-
| '''Ik Chain'''
| Source
| selects the chain of bones (chains are defined for entire graph in anim workspace)
| Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
|-
| Looptype
| Enables looped playback.
|-
| Predictions
| List of sampled predictions (future bone transforms in the animation)
* '''AnimSrcNodePrediction'''
: {| class="wikitable"
! Property
! Description
|-
| Name
| Prediction name
|-
| Bone
| Name of channel to be sampled.
|-
| Event
| Bind the time of this prediction to an event with matching name.
|-
| PercentTime
| Normalized time of the prediction [0 - 1].
|-
| Translation
| Select when translation should be sampled.
|-
| Rotation
| Select when rotation should be sampled.
|-
| MainPath
| Select when the prediction should be sampled only on graph's main path.
|}
|}
|-
| SyncLine
| Name of sync line which maps normalized time to events in the animation.
|-
| ReportDistance
| Using root motion channel, report sample distance travelled until end of cycle (when looped) or animation (when unlooped).
|}
|}


=== IK Rotation ===
=== State Machine ===


Animation node applying inverse kinematics to reach target rotation. Position is untouched. Useful for spine inverse kinematics instead of counter-animating hip rotations.
==== State ====
Represents one state inside state machine node, serves as a bridge from state machine to other nodes. State node cannot exist on its own.


{| class="wikitable"
{| class="wikitable"
Line 532: Line 1,518:
! Description
! Description
|-
|-
| '''Weight'''
| Child
| Weight, 0-1. When zero, no rotations are applied, when one, rotations are fully applied.
| Link to child node
|-
| StartCondition
| Evaluated on state machine initialization, first state returning true becomes active
|-
| TimeStorage
| By default, time is 'inherited' from parent nodes. Change if you want to measure time locally.
|-
| IsExit
| Enable to pass remaining time from child node to parent of state machine. Disable to mask out the remaining time.
|-
|-
| '''Chains'''
| PassThrough
| List of chains and their IK targets.
| State machine will try to leave this state even if it was just entered. Child nodes are still evaluated. Pass-through is ignored in post-eval.
|}
 
==== State Machine ====
State machines contain multiple state nodes and transitions between them.
One of the states is marked 'active'. On every frame, state machine evaluates transitions leading from the active state and if their condition is fulfilled, target state of the transition becomes the new 'active' state.
Previous state keeps playing for a short 'blend-out' time, if specified by transition.


{| class="wikitable"
{| class="wikitable"
Line 542: Line 1,543:
! Description
! Description
|-
|-
| '''Ik Target'''
| States
| identifier of target transform, supplied by '''IK2 Target''' or by game code
| List of state nodes inside state machine.
* '''State'''<br>Represents one state inside state machine node, serves as a bridge from state machine to other nodes. State node cannot exist on its own.
: {| class="wikitable"
! Property
! Description
|-
| Child
| Link to child node
|-
| StartCondition
| Evaluated on state machine initialization, first state returning true becomes active
|-
| TimeStorage
| By default, time is 'inherited' from parent nodes. Change if you want to measure time locally.
|-
| IsExit
| Enable to pass remaining time from child node to parent of state machine. Disable to mask out the remaining time.
|-
| PassThrough
| State machine will try to leave this state even if it was just entered. Child nodes are still evaluated. Pass-through is ignored in post-eval.
|}
|-
| Transitions
| List of transitions inside state machine.
* '''AnimSrcNodeTransition'''
: {| class="wikitable"
! Property
! Description
|-
| FromState
| Source state
|-
| ToState
| Target state
|-
| Duration
| Transition blending time
|-
| StartTime
| Start time to be set on the target state once transition triggers
|-
| Condition
| Once true, state machine will set target state as its new active state.
|-
| BlendFn
| Blend weight shaping (linear, s-curve, etc.).
|-
| PostEval
| Post-eval transition is evaluated in bottom-up phase of this part of animation graph.
|-
| Reentering
| ''No description''
|-
| Priority
| Set the order of evaluating transition conditions. Lower value is evaluated earlier.
|-
| MotionVecBlend
| Root motion blending options.
|-
| Events
| Fired event once this transition is triggered
* '''AnimSrcEvent'''
: {| class="wikitable"
! Property
! Description
|-
| Name
| Event identifier
|-
| Comment
| Any explaining messages belong here. Ignored in runtime.
|-
| MainPathOnly
| When enabled, event is sampled only on main path
|-
| InitOnly
| Event is sampled just on node init (Event Node only)
|-
| Condition
| When filled in, event is sampled only if this condition results true. (Event Node only)
|-
| Once
| When enabled, this events triggers only on first frame the condition is valid.
Re-trigger is possible only after a frame the condition evaluates to false (Event Node only).
|-
| Frame
| Frame number of the event start (Animation only)
|-
| FrameCount
| Duration of the event (Animation only)
|}
* '''AnimSrcEventGeneric''' : AnimSrcEvent
: {| class="wikitable"
! Property
! Description
|-
| UserString
| Additional string attribute
|-
| UserInt
| Additional integer attribute
|}
* '''AnimSrcEventAudio''' : AnimSrcEvent
|-
|-
| '''Ik Chain'''
| Tags
| selects the chain of bones (chains are defined for entire graph in anim workspace)
| Tags set on the output during this transition.
|}
|}
|}
|}


=== Weapon IK ===
=== Tag ===


This node is used for weapon related pose corrections and inverse kinematics.
==== Tag ====
Adds a tag to animation output. The node can also temporarily add tags just for child nodes.


* Compares current weapon direction with desired direction
{| class="wikitable"
* Rotates weapon to correct direction
! Property
* Snaps primary and secondary chain (arms) onto weapon
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| ChildTags
| List of tags passed to the child nodes but not to the parent nodes.
|}
 
=== Time ===
 
==== Time Save ====
Anim graph node saving time into stash.


{| class="wikitable"
{| class="wikitable"
Line 562: Line 1,684:
! Description
! Description
|-
|-
| Config Name
| Tags
| This defines what the IK setup is called
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
|-
| Config
| TimeName
| Configuration of IK node.
| Storage name
|}


Binding to names of joints of primary/secondary chain.
==== Time Scale ====
AnimNodeTimeScale scales the input time, effectively slowing down or speeding up animations in the subtree below.


Select which joint axes match with chain orientation.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
|-
| Aim On
| Child
| set to true when the character is aiming
| Link to child node
 
* then it aligns the weapon orientation with inputs Weapon Dir LR and Weapons Dir UD
* it also force enables IK on primary chain
|-
|-
| Prim On
| TimeExpr
| set to true to enable IK on primary chain
| Multiplier remapping time. For example, 2.0 will cause the subtree to run twice as fast.
(usually right arm)
|-
|-
| Sec On
| TimeStorage
| set to true to enable IK on secondary chain
| By default, time is 'inherited' from parent nodes. Change if you want to measure time locally.
(usually left arm)
|-
|-
| Blend Time
| TimeMappingTable
| Blending time for changes of "Aim On", "Prim On"
| When filled in, result from TimeExpr is remapped through this table to new actual value of the multiplier.
|}


and "Sec On".
==== Time Use ====
Anim graph node restoring time from stash.


(how long it takes to blend from/into aiming state
{| class="wikitable"
 
! Property
or primary state or secondary state)
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
|-
| Weapon Dir LR Angle
| TimeName
| Horizontal aiming angle, used for aligning the weapon
| Storage name
when Aim On is set to true.
|-
|-
| Weapon Dir UD Angle
| TimeType
| Vertical aiming angle, used for aligning the weapon
| Specify type of restored time - either real or normalized.
 
when Aim On is set to true.
|}
|}


=== Switch Node ===
=== Variables ===


This node enables switching between multiple sources which variable chances between each source.
==== Var Reset ====
Anim Node Var Set - sets variable values when defined conditions are met


{| class="wikitable"
{| class="wikitable"
Line 613: Line 1,755:
! Description
! Description
|-
|-
| Use NTime
| Tags
| This defines whether to use normalised time when evaluating the sources
| Tags set to animation output.
|-
|-
| NTime Cycle
| NodeGroup
| {{Wiki|TODO}}
| Name of parent node group, visual and logical aid.
|-
|-
| Items
| Child
|
| Link to child node
{| class="wikitable"
|-
| VarReset
| List of variables to be reset to original game input
* '''AnimSrcNodeVarResetItem'''
: {| class="wikitable"
! Property
! Property
! Description
! Description
|-
|-
| Link
| VariableName
| This defines what node this item is connected to
| ''No description''
|-
| SetOnInit
| When enabled, variable is set on init (first frame)
|-
|-
| Start Cond
| SetOnMainPath
| This defines what this item's start condition is
| When enabled, variable is set every frame on main path
|-
|-
| Next
| SetOnBlendOut
| This defines what item should have a certain chance
| When enabled, variable is set every frame on secondary path (when blending out)
 
at playing after this item has looped:
 
40%=0, 10%=1, 10%=2, 10%=3, 10%=4, 10%=5, 10%=6
 
The snippet is from item 0, where it has a 40% chance
 
of replaying the same source, and an equal 10%
 
to play another animation.
|}
|}
|}
|}


=== Attachment ===
==== Var Set ====
 
Sets new value to variables when conditions are met. Changes apply only to child nodes.
Attachment node provides dynamic link to a different graph.
 
The attachment is provided by the game and attachment node picks it by the binding name. Link may lead to different animation graph with different animation instance.
 
Attachment nodes are useful for example for weapons, vehicles, animation modding...
 
Attachments can be inserted for debugging in the animation editor through Attachments Debug window:


{| class="wikitable"
{| class="wikitable"
Line 660: Line 1,792:
! Description
! Description
|-
|-
| Binding name
| Tags
| Name of the attachment.
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| VarSet
| List of variables to be set to new value. Value is restored once returning to parent node.
* '''AnimSrcNodeVarSetItem'''
: {| class="wikitable"
! Property
! Description
|-
|-
| Fixed
| VariableName
| Attached animation graph and instance are bound once the node starts playing. The binding is reset only when the node stops playing.
| Variable name
|-
| SetOnInit
| When enabled, variable is set on init (first frame)
|-
| SetOnMainPath
| When enabled, variable is set every frame on main path
|-
| SetOnBlendOut
| When enabled, variable is set every frame on secondary path (when blending out)
|-
| PostEval
| When enabled, value is updated after child nodes, stored and applied for the subtree on next frame.
|}
* '''AnimSrcNodeVarSetBoolItem''' : AnimSrcNodeVarSetItem<br>Change value of bool variable. Changes apply only to child nodes.
: {| class="wikitable"
! Property
! Description
|-
| Value
| New bool value
|}
* '''AnimSrcNodeVarSetIntItem''' : AnimSrcNodeVarSetItem<br>Change value of int variable. Changes apply only to child nodes.
: {| class="wikitable"
! Property
! Description
|-
| Value
| New int value
|}
* '''AnimSrcNodeVarSetFloatItem''' : AnimSrcNodeVarSetItem<br>Change value of float variable. Changes apply only to child nodes.
: {| class="wikitable"
! Property
! Description
|-
| Value
| New float value
|}
* '''AnimSrcNodeVarSetStringItem''' : AnimSrcNodeVarSetItem<br>Change value of string variable. Changes apply only to child nodes.
: {| class="wikitable"
! Property
! Description
|-
| Value
| New string value
|}
|}
|}


=== Event ===
==== Var Update ====
Limit control variable updates by conditions, limit change rate. Changes apply only to child nodes.
Example Usage: Freeze movement direction variable when blending out from a branch.


'''Event''' node fires a set of animation events once the node becomes active.
{| class="wikitable"
! Property
! Description
|-
| Tags
| Tags set to animation output.
|-
| NodeGroup
| Name of parent node group, visual and logical aid.
|-
| Child
| Link to child node
|-
| VarUpdate
| List of variables with limited update rate. Limits apply only to child nodes.


This is useful when we need to signal other parts of engine or game code that a branch in animation graph became active. (for example, audio engine can react to stance changes)
* '''AnimSrcNodeVarUpdateItem'''
 
: {| class="wikitable"
* Fill in the expression to limit when the event is triggered.
! Property
* Empty expression means that the event is triggered every time.
! Description
* Event can be triggered on node init only or on every time the node is updated.
|-
| VariableName
| Identifier
|-
| UpdateOnInit
| When enabled, variable is updated on init (first frame)
|-
| UpdateOnMainPath
| When enabled, variable is updated every frame on main path
|-
| UpdateOnBlendOut
| When enabled, variable is updated every frame on secondary path (when blending out)
|-
| PostEval
| When enabled, value is updated after child nodes, stored and applied for the subtree on next frame.
|-
| Condition
| When filled in, variable is updated only when this condition is fulfilled.
|-
| MaxDifferencePerSecond
| Maximum difference of value per second. Variable value will not change faster below this node. Float variables only.
|-
| IsCyclic
| When enabled, variable might blend towards target 'the other way around' its range. Useful for example for motion direction angle.
|}
|}




== See Also ==
== See Also ==


* [[Arma Reforger:Animation Editor|Animation Editor]]
* {{Link|Arma Reforger:Animation Editor}}
* [[Arma Reforger:Animation Editor: State Machine|Animation Editor: State Machine]]
* {{Link|Arma Reforger:Animation Editor: State Machine}}
* [[Arma Reforger:Animation Editor: Sync Tutorial|Animation Editor: Sync Tutorial]]
* {{Link|Arma Reforger:Animation Editor: Sync Tutorial}}




{{GameCategory|armaR|Modding|Official Tools}}
{{GameCategory|armaR|Modding|Official Tools}}

Latest revision as of 17:41, 13 December 2024

An animation node is a fundamental block of the animation engine. Each node has a single (and simple) purpose. By connecting these nodes to one big hierarchy, complex behaviour can be achieved. Usually the hierarchy is organised top to bottom, connecting parent nodes to child nodes.

Each node is displayed as a small rectangle, first line tells us the node type, second line contains node name. The name has to be unique, which is used as a reference when linking to it from other nodes. Naming is case sensitive.

Slots, which can be found at the bottom of some node types, serve to connect a node to any child node.


Animation Graph Evaluation

Imagine the evaluation as a process happening in two phases.

DOWN. Animator and character programmer agree on "master" (main, topmost) node. The animation graph evaluation starts at this node and continues to child nodes. Logic in animation nodes affects which child paths are evaluated and which are ignored. This way the evaluation traverses from topmost node to bottom of the graph.

UP. Once there are no valid child nodes where to continue the search, the evaluation returns back, carrying an animation pose as a result. This pose can be blended with other poses returned from different child paths or for example.

(SIMPLIFIED. Logic is evaluated from top to bottom, left to right. Results (animation poses) are passed to parent node until they reach the topmost node.)

Order of evaluation is important, because it affects values used in conditions and other expressions. For example, when using tags, remaining time or events in an expression, it must be checked after all child nodes are evaluated, otherwise these values are still unknown.


Time and Timing

One of the inputs of an animation node is a time. Time is for advancing animations, essentially - playing the animations. The node usually passes this time to linked child nodes, however, some node hold their own clock. There are two ways to measure time:

  • Real time. Time as we know it, it advances forward.
  • Normal time. Time used to synchronise animations. It scales between synchronization points, so multiple animations can be blended nicely.
Read more about Syncing Animation: Animation Editor: Sync Tutorial.


Node Types

Common Properties

Property Description
Node Name Unique node name, case sensitive.
Tags User defined tags. Tags are returned together with resulting pose. Game code can read the returned tags and react to them.
Child Link to child node/multiple children

Attachment

Attachment

Attachment node provides dynamic link to a different graph using different animation instance. The attachment is provided by the game and attachment node picks it by the binding name. Attachments can be inserted for debugging in the animation editor through Attachments Debug window. Attachment node translates the inputs (graph variables, commands...) into form accepted by attached graph which may influence the performance.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Binding Binding name of the attachment.

Blend

Blend

Used to blend between two child nodes. Blend node supports both "normal" and "additive" blending and required no further setup for that manner, since every animation track already contains information whether it is additive. Blending is immediate - based on a value or variables. Blending weight can change rapidly between frames, no time-based blending is done.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BlendWeight Blending weight (0 - 1).
Child0 First child, having 100% influence when blending weight is 0.
Child1 Second child, having 100% influence when blending weight is 1.
BlendFn Blend weight shaping (linear, s-curve, etc.).
MotionVectors Option specifying where to accept root motion from. 'Both' blends root motion vectors from both children.
IkTargets Behavior of IK targets blending
Optimization Optimization may turn off evaluation of child nodes which have 0% influence.
SelectMainPath When enabled, only the path with weight over 0.5 is marked as a main path.

Blend N

Blend node N allows mixing results from multiple child nodes, each child node corresponds to one threshold value. Can be useful for example when blending between different directions of walking animations (0-360). Blending is immediate - based on a value or variables. Blending weight can change rapidly between frames, no time-based blending is done.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BlendWeight Value which controls the blending between two surrounding thresholds.
BlendFn Blend weight shaping (linear, s-curve, etc.)
Thresholds Each child node corresponds to one threshold, thresholds must go from lower to higher values.
Children Links to child nodes.
IsCyclic Enable cyclic behavior (first threshold is identical to last, even with different values). Tick and add another Threshold at the end of Thresholds that corresponds to the first Input Link (for example, threshold would be -180,-90,0,90,180 when doing directional animations)
SelectMainPath When enabled, only the path with weight over 0.5 is marked as a main path.

Blend T

Provides blending between two child nodes over time. When a condition is met, Blend T starts blending towards the other child node over time.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BlendTime Full blending time in seconds.
BlendFn Blend weight shaping (linear, s-curve, etc.).
TriggerOn Condition to start blending into secondary branch (if filled in, 'Condition' is ignored).
TriggerOff Condition to start blending back into primary branch (if filled in, 'Condition' is ignored).
Condition Condition to switch between primary and secondary branch.
Child0 Primary child node
Child1 Secondary child node
Optimization Select when to evaluate child nodes.
SelectMainPath When enabled, only the path with weight over 0.5 is marked as a main path.
PostEval If post-eval is checked, triggers or condition are evaluated after child nodes.
IkTargets Behavior of IK targets blending

Blend T Add

Similarly to Blend T, this node provides blending over time, primary path always keeps playing as a main path. Useful for additive blending.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BlendTime Full blending time in seconds.
BlendFn Blend weight shaping (linear, s-curve, etc.).
TriggerOn Condition to start blending into secondary branch (if filled in, 'Condition' is ignored).
TriggerOff Condition to start blending out of secondary branch (if filled in, 'Condition' is ignored).
Condition Condition to switch between primary and secondary branch.
Child0 Primary child node
Child1 Secondary child node
AdditiveAlways When enabled, secondary child node is always evaluated regarless its current weight.

Blend TW

Time dependent blend between two child nodes. Unlike BlendT which utilizes thresholds, Blend TW blends towards target value.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
TargetWeight Target blending value, reached over time.
BlendTime Time to reach target weight = 1 all the way from 0.
BlendFn Blend weight shaping (linear, s-curve, etc.).
BlendTimeFn Shaping of difference between target and current weight
Child0 First child, having 100% influence when blending weight is 0.
Child1 Second child, having 100% influence when blending weight is 1.
Optimization Optimization may turn off evaluation of child nodes which have 0% influence.
SelectMainPath When enabled, only the path with weight over 0.5 is marked as a main path.
IkTargets Behavior of IK targets blending
OptimizeMin When set to true and blending weight is zero, second child node is not evaluated
OptimizeMax When set to true and blending weight is one, first child node is not evaluated

Queue

Supports enqueuing and playing secondary child nodes and blending them with primary path. This can be used for both additive and full body animations, where the full body will override the main link, and the additive animation will play on top of the main link.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Primary child node, always evaluated regardless queued actions.
QueueItems List of queue items which can be played as secondary actions.
  • AnimSrcNodeQueueItem
Property Description
Child Child node of queue item.
StartExpr Condition to start playing this item
InterruptExpr Optional condition to interrupt this item
StartTime Optional starting time
BlendInTime Time to fully blend in
BlendOutTime Time to fully blend out
EnqueueMethod Behavior of item start - select if it is allowed to interrupt other items or self.
TagMainPath When this item is playing, this tag is set on the primary path of the queue node.
CacheOnEnqueue List of cached variable values and commands, frozen during enqueuing and passed unchanged to this playing item.
  • AnimSrcVarCmdTempStorage
Property Description
Variables No description
Commands No description
IkTargets Behavior of IK targets blending

Switch

Plays child nodes and switches to next one randomly, once they finish playing.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BlendTime Transition time between child nodes.
FirstProbabilities List of numbers separated by commas or spaces, representing probability per node.
SwitchItems List of child nodes and their probability tables.
  • AnimSrcNodeSwitchItem
Property Description
Child Link to child node
NextProbabilities List of numbers separated by commas or spaces, representing probability per node.

Buffer

Buffer Save

Saves contents of current pose buffer in the node to named temporary storage.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
BufferName Storage name
BoneMask Inclusive mask restricting saved bones. If no mask is selected, all bones are saved.

Buffer Use

Restore previously saved pose buffer from temporary storage.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BufferName Storage name
BoneMask Inclusive mask restricting restored bones. If no mask is selected, all bones are used.

Filter

Filter current pose buffer by bone mask.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
BoneMask Inclusive mask restricting bones kept in the pose buffer. If no mask is selected, all bones are kept.
Condition Expression enabling this filter

Ctx

Ctx Begin

Ctx Begin and Ctx End surround branched block of the graph, protecting subgraph below Ctx End against losing its state during branch switches the state of subgraph is bypassed and safely stored in Ctx Begin. Traversing through Ctx End is allowed only for the first branch which reaches it, other branches inside the block receive cached result.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node. First node in the branched block.

Ctx End

Ctx Begin and Ctx End surround branched block of the graph, protecting subgraph below Ctx End against losing its state during branch switches the state of subgraph is bypassed and safely stored in Ctx Begin. Traversing through Ctx End is allowed only for the first branch which reaches it, other branches inside the block receive cached result.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node. Subgraph below the branched block of the graph.

Event

Event

Fires animation events when the node is activated or condition is fulfilled. This is useful when we need to signal other parts of engine or game code that a branch in animation graph became active (for example, audio engine can react to stance changes).

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node.
Events List of events and their conditions
  • AnimSrcEvent
Property Description
Name Event identifier
Comment Any explaining messages belong here. Ignored in runtime.
MainPathOnly When enabled, event is sampled only on main path
InitOnly Event is sampled just on node init (Event Node only)
Condition When filled in, event is sampled only if this condition results true. (Event Node only)
Once When enabled, this events triggers only on first frame the condition is valid.

Re-trigger is possible only after a frame the condition evaluates to false (Event Node only).

Frame Frame number of the event start (Animation only)
FrameCount Duration of the event (Animation only)
  • AnimSrcEventGeneric : AnimSrcEvent
Property Description
UserString Additional string attribute
UserInt Additional integer attribute
  • AnimSrcEventAudio : AnimSrcEvent

Function

Function Begin

Function Begin and Function end surround graph block which can be called (reused) on multiple other places.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node. First node inside the function block.
EndsCount Number of function end points (FunctionEnd nodes)

Function Call

Redirects evaluation into a function - a block of nodes starting with Function Begin. After the evaluation inside the block reaches any Function End, evaluation resumes at this place.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Method Function name (Function Begin node name)
Child0 No description
Child1 No description
Child2 No description
Child3 No description
Child4 No description
Child5 No description
Child6 No description
Child7 No description

Function End

Function Begin and Function end surround graph block which can be called (reused) on multiple other places.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
EndIndex Index of a following child node at call site.

Group Select

Group Select

Selects an active column in anim set group. Animation and constants identifiers may then omit column name because it is selected by this node. Example: Group select node selects column "Erc" in group "Locomotion". Source node below refers to animation "Locomotion.Walk" but active column is filled in, resulting in unique animation identifier "Locomotion.Erc.Walk".

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Group Anim set group containing the column
Column Anim set column within the group to be selected

IK

IK2

Node which applies inverse kinematics on a chain of bones to reach a specific target.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Weight Weight (0-1). When zero, no IK is applied, when one, IK is fully applied.
Chains List of chains and their IK targets.
  • AnimSrcIkBinding
Property Description
IkTarget IK target name
IkChain IK chain name
Solver Select an instance of IK solver to run.
  • AnimSrcNodeIK2Solver
  • AnimSrcNodeIK2FabrikSolver : AnimSrcNodeIK2Solver
    Iterative solver with basic rotation limits.
Property Description
SnapRotation Snap rotation of end effector to align with IK target.
RotationLimitPerBone Maximum rotation [degrees] applied per bone in chain
TightenToTarget Percentage of chain where rotation limit tightens to zero
TwistPropagation Percentage of chain receiving twist from the snapped rotation
MaxIterations Maximum number of iterations when the solver stops even if the target is not reached
  • AnimSrcNodeIK2TwoBoneSolver : AnimSrcNodeIK2Solver
    Analytic two-bone solution. If the chain contains more than two bones, it is split into two segments by its mid-joint.
Property Description
SnapRotation Snap rotation of end effector to align with IK target.
AllowStretching Allow chain stretching when the IK target is out of reach.
MidPivotTwist Additional twist of mid pivot plane in radians.
  • AnimSrcNodeIK2LookAtSolver : AnimSrcNodeIK2Solver
    Solver which rotates the chain that its end effector is facing the target.
Property Description
Axis Axis to aim at target.
  • AnimSrcNodeIK2LookInDirSolver : AnimSrcNodeIK2Solver
    Solver which rotates the chain that its end effector is aligned with selected axis of the target.
Property Description
Axis Axis to aim in target's direction.
TargetAxis Target axis chosen as its direction.
  • AnimSrcNodeIK2PoleSolver : AnimSrcNodeIK2Solver
    Solver rotating around twist axis, aligning mid-joint with the target.

IK2 Plane

Computes inverse kinematics on a chain to reach target plane. Target planes are set by application (character/gameplay programmers).

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Weight Weight (0-1). When zero, no IK is applied, when one, IK is fully applied.
Chains List of chains and their IK plane targets.
  • AnimSrcIkBinding
Property Description
IkTarget IK target name
IkChain IK chain name
ActiveDistance Thresholding distance [m]. If the end effector is further, no IK is applied even when weight is one. In meters.
ThresholdSmoothness Smoothing region [m] to turn on IK continuously.
SnapRotation Snap the rotation of end effector to be the same as ik target rotation.
CustomNormal When zero, IK2 Plane pushes the end effector along the normal of plane.

In some situations it may be feasible to move it in a custom direction, for example pushing up when correcting feet by IK.

IK2 Target

Creates an ik target from model-space position of a bone or end effector of a chain.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Chains List of ik targets to be created and assigned transform from specified chains. Additional offsets might be applied.
  • AnimSrcIkTargetBinding
Property Description
IkTarget IK target name
IkChain Chain name
LocalSpaceOffset Offset applied to chain in local space (affected by parent transforms)
  • AnimSrcTransformOffset
Property Description
Position Position offset
Rotation Rotation offset
Pose Source id of an animation pose. This pose is used to set the local offset from chain's end effector. Serves probably better than guessing transform numbers.

Note: column/group selects apply here same way as in source nodes. Example: when we were constraining left hand to first person camera, we exported a pose with two bones in world space - head and left hand. Then these two bones describe the offset where to place an IK target.

FromBone Offset is measured from bone having this name...
ToBone Offset is measured to bone having this name.
FromFrame Offset is measured from bone sampled on this frame
ToFrame Offset is measured to bone sampled on this frame.
BonesAreInModelSpace When checked, the pose is in model space and does not need to accumulate bones from local space.
ModelSpaceOffset Offset applied to chain in model space (unaffected by parent transforms)
  • AnimSrcTransformOffset
Property Description
Position Position offset
Rotation Rotation offset
Pose Source id of an animation pose. This pose is used to set the local offset from chain's end effector. Serves probably better than guessing transform numbers.

Note: column/group selects apply here same way as in source nodes. Example: when we were constraining left hand to first person camera, we exported a pose with two bones in world space - head and left hand. Then these two bones describe the offset where to place an IK target.

FromBone Offset is measured from bone having this name...
ToBone Offset is measured to bone having this name.
FromFrame Offset is measured from bone sampled on this frame
ToFrame Offset is measured to bone sampled on this frame.
BonesAreInModelSpace When checked, the pose is in model space and does not need to accumulate bones from local space.
Bones List of ik targets to be be created and assigned transform from specified model-space transforms of bones.
  • AnimSrcIkTargetBinding
Property Description
IkTarget IK target name
Bone Measured offset from bone of this name...

IK Lock

Animation node locking the ik target in place and applying two-bone IK solver.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
IsLocked Expression enabling the lock.
BlendinTime Blend time for IK to fully take over.
BlendoutTime Blend time for IK to be fully released.
SnapRotation Snap the rotation of end effector to be the same as ik target rotation.
World Name of world transform delta passed by the game. This can be used to lock targets onto moving ground, for example.
Chains List of IK targets and affected chains
  • AnimSrcIkBinding
Property Description
IkTarget IK target name
IkChain IK chain name

IK Rotation

Animation node applying inverse kinematics to reach target rotation, local translations are untouched. When enabled, rotation of end-effector is identical to IK target, parent bones receive a fraction of the rotation. Useful for spine inverse kinematics instead of counter-animating hip rotations.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Weight Weight (0 - 1). When zero, no rotation changes are applied, when one, rotations are fully applied.
Chains List of IK targets and affected chains
  • AnimSrcIkBinding
Property Description
IkTarget IK target name
IkChain IK chain name

RBF

No description

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child No description
Rbf No description

Weapon IK

Specialized node positioning arms according to aim direction and applying 2-joint ik on arms to snap to weapon. Algorithm: Compares current weapon direction with desired direction. Rotate weapon to correct direction. Snaps primary and secondary chain (arms) onto weapon.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
IkconfigName Name of the Weapon IK configuration
Ikconfig Configuration. Exposes IK pose channels to solver. Defines primary and secondary chain and their orientation.
BlendInTime Blending time to fully enable 'Aim On', 'Prim On' and 'Sec On'.
BlendOutTime Blending time to fully disable 'Aim On', 'Prim On' and 'Sec On'.
WeightAim Enable aiming correction.
WeightPrimaryChain Enable IK on primary chain (right arm).
WeightSecondaryChain Enable IK on secondary chain (left arm).
WeaponDirLr Horizontal weapon aiming angle, used when Aim On=1
WeaponDirUd Vertical weapon aiming angle, used when Aim On=1
WeaponRoll Weapon roll, used when Aim On=1
WeaponTransX Additional weapon translation in model-space X direction
WeaponTransY Additional weapon translation in model-space Y direction
WeaponTransZ Additional weapon translation in model-space Z direction

Memory

Memory

Allows to save several bones into the local memory and fill them in on later frames if they are not present in pose buffer anymore.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BoneMask Bone mask with a list of remembered bones
Child Link to child node

Procedural

Constraint

No description

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Weight Weight of the applied constraint
Constraint Select a constraint to be applied
  • AnimSrcConstraint
Property Description
AffectedBone Name of bone affected by the constraint. If filled in, affected IK target must remain empty.
AffectedIk Name of IK target affected by the constraint. If filled in, affected bone must remain empty.
TargetBone Target bone for the constraint solver. If filled in, target IK target must remain empty.
TargetIk Target IK target for the constraint solver. If filled in, target bone must remain empty.
InitPose Constraint can be initialized from current or bind pose.
CustomSpace If filled in, constraint is computed in custom space
  • AnimSrcConstraintCustomSpace
Property Description
AffectedSpace No description
AffectedPivotBone No description
AffectedPivotIk No description
TargetSpace No description
TargetPivotBone No description
TargetPivotIk No description
  • AnimSrcConstraintPosition : AnimSrcConstraint
    Constraint which can fixate translation offset between two bones (or ik targets). The offset can also decay over time.
Property Description
OffsetSoftLimit Threshold which where the limit distance starts to be applied softly. Must be less than hard limit.
OffsetHardLimit Maximum distance travelled from original position.
OffsetDampening Rate of decay from offset hard limit to offset soft limit. Zero means immediate dampening, one means no dampening.
Components Influence per component X, Y, Z.
  • AnimSrcConstraintParent : AnimSrcConstraint
    Constraint which can fixate translation and rotation offset between two bones (or ik targets).
Property Description
RotateFirst Rotate affected around target first before resolving position.

Procedural

AnimNodeProcTransform applies procedural transform on a set of joints or IK targets through entered expressions.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
Expression Applied amount multiplier.
Bones List of operations on bones
  • AnimSrcNodeProcTrBoneItem
Property Description
Bone Name of affected bone
Axis Translation/rotation axis
Space Proc transform can be done in model-space, local-space or pivot-space.
Op Operation to perform (translation, rotation, ...)
Amount Applied amount, multiplied by shared Expression in the node
PivotBone Pivot bone, used when operating in pivot-space
PivotIk Pivot IK target, used when operating in pivot-space
IkTargets List of operations on IK targets
  • AnimSrcNodeProcTrIkTargetItem
Property Description
IkTarget Name of affected IK target
Axis Translation/rotation axis
Space Proc transform can be done in model-space, local-space or pivot-space.
Op Operation to perform (translation, rotation, ...)
Amount Applied amount, multiplied by shared Expression in the node
PivotBone Pivot bone, used when operating in pivot-space.
PivotIk Pivot IK target, used when operating in pivot-space

Sleep

Sleep

Sleep node can turn off evaluation of all its child nodes and return empty result instead, drastically saving performance. The node goes to sleep after its awake condition is not fulfilled during entire timeout period. In an ideal case, it should be used as a starting node - when sleeping, many processes inside graph evaluation are skipped early.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
AwakeExpr When false, node goes to sleep mode after a timeout, effectively turning off child nodes.
Timeout Timeout before going to sleep mode. Awake expression resets the timeout.

Source

Bind Pose

Sample bind pose of the animated mesh.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
BoneMask Inclusive bone mask restricts which bones are sampled. If no mask is specified, all bones are sampled.

Pose

Sample a pose from an animation. Unlike Source node, Pose node does not play the animation, sampled frame is computed from an expression. Pose node blends between two closest frames when the variable value falls between them. Example usage: steering in a vehicle, having all steering poses in one animation and using a variable to select a pose to be played

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Source Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
Time Normalized sampling time (0 - 1)

Pose 2

Samples a pose from an animation based on control expressions and 2D table. Similar to plain Pose node, but it works in two-dimensional space. Example usage: Aim Spaces and Look Animations - mapping horizontal and vertical direction to a pose.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Source Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
ValueX Expression for the X coordinate
ValueY Expression for the Y coordinate
Table Table remapping X and Y coord to frames

Source

Plays an animation from anim set. Playback can be looped.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Source Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
Looptype Enables looped playback.
Interpolate When enabled, keyframes are interpolated during playback.
Predictions List of sampled predictions (future bone transforms in the animation)
  • AnimSrcNodePrediction
Property Description
Name Prediction name
Bone Name of channel to be sampled.
Event Bind the time of this prediction to an event with matching name.
PercentTime Normalized time of the prediction [0 - 1].
Translation Select when translation should be sampled.
Rotation Select when rotation should be sampled.
MainPath Select when the prediction should be sampled only on graph's main path.
BonesInterpolatedInModelSpace List of bones interpolated in model-space, which be required to prevent stutters caused by inheriting all interpolations in hierarchy.
ReportDistance Using root motion channel, report sample distance travelled until end of cycle (when looped) or animation (when unlooped).

Source InLoopOut

Plays an animation from anim set. The animation is divided by events into three segments: intro, loop, outro. Playback leaves the looped region only a condition is fulfilled.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Source Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
InEvent Name of event marking the end of intro and start of looped region.
OutEvent Name of event marking the end of looped region and start of outro.
EndExpression If the expression results in true, further looping is disabled, allowing playback to reach the end.

Source Sync

Plays an animation from anim set using normalized time. Playback can be looped.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Source Animation source id in format Group.Column.Animation or Group.Animation when relying on Group Select nodes.
Looptype Enables looped playback.
Predictions List of sampled predictions (future bone transforms in the animation)
  • AnimSrcNodePrediction
Property Description
Name Prediction name
Bone Name of channel to be sampled.
Event Bind the time of this prediction to an event with matching name.
PercentTime Normalized time of the prediction [0 - 1].
Translation Select when translation should be sampled.
Rotation Select when rotation should be sampled.
MainPath Select when the prediction should be sampled only on graph's main path.
SyncLine Name of sync line which maps normalized time to events in the animation.
ReportDistance Using root motion channel, report sample distance travelled until end of cycle (when looped) or animation (when unlooped).

State Machine

State

Represents one state inside state machine node, serves as a bridge from state machine to other nodes. State node cannot exist on its own.

Property Description
Child Link to child node
StartCondition Evaluated on state machine initialization, first state returning true becomes active
TimeStorage By default, time is 'inherited' from parent nodes. Change if you want to measure time locally.
IsExit Enable to pass remaining time from child node to parent of state machine. Disable to mask out the remaining time.
PassThrough State machine will try to leave this state even if it was just entered. Child nodes are still evaluated. Pass-through is ignored in post-eval.

State Machine

State machines contain multiple state nodes and transitions between them. One of the states is marked 'active'. On every frame, state machine evaluates transitions leading from the active state and if their condition is fulfilled, target state of the transition becomes the new 'active' state. Previous state keeps playing for a short 'blend-out' time, if specified by transition.

Property Description
States List of state nodes inside state machine.
  • State
    Represents one state inside state machine node, serves as a bridge from state machine to other nodes. State node cannot exist on its own.
Property Description
Child Link to child node
StartCondition Evaluated on state machine initialization, first state returning true becomes active
TimeStorage By default, time is 'inherited' from parent nodes. Change if you want to measure time locally.
IsExit Enable to pass remaining time from child node to parent of state machine. Disable to mask out the remaining time.
PassThrough State machine will try to leave this state even if it was just entered. Child nodes are still evaluated. Pass-through is ignored in post-eval.
Transitions List of transitions inside state machine.
  • AnimSrcNodeTransition
Property Description
FromState Source state
ToState Target state
Duration Transition blending time
StartTime Start time to be set on the target state once transition triggers
Condition Once true, state machine will set target state as its new active state.
BlendFn Blend weight shaping (linear, s-curve, etc.).
PostEval Post-eval transition is evaluated in bottom-up phase of this part of animation graph.
Reentering No description
Priority Set the order of evaluating transition conditions. Lower value is evaluated earlier.
MotionVecBlend Root motion blending options.
Events Fired event once this transition is triggered
  • AnimSrcEvent
Property Description
Name Event identifier
Comment Any explaining messages belong here. Ignored in runtime.
MainPathOnly When enabled, event is sampled only on main path
InitOnly Event is sampled just on node init (Event Node only)
Condition When filled in, event is sampled only if this condition results true. (Event Node only)
Once When enabled, this events triggers only on first frame the condition is valid.

Re-trigger is possible only after a frame the condition evaluates to false (Event Node only).

Frame Frame number of the event start (Animation only)
FrameCount Duration of the event (Animation only)
  • AnimSrcEventGeneric : AnimSrcEvent
Property Description
UserString Additional string attribute
UserInt Additional integer attribute
  • AnimSrcEventAudio : AnimSrcEvent
Tags Tags set on the output during this transition.

Tag

Tag

Adds a tag to animation output. The node can also temporarily add tags just for child nodes.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
ChildTags List of tags passed to the child nodes but not to the parent nodes.

Time

Time Save

Anim graph node saving time into stash.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
TimeName Storage name

Time Scale

AnimNodeTimeScale scales the input time, effectively slowing down or speeding up animations in the subtree below.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
TimeExpr Multiplier remapping time. For example, 2.0 will cause the subtree to run twice as fast.
TimeStorage By default, time is 'inherited' from parent nodes. Change if you want to measure time locally.
TimeMappingTable When filled in, result from TimeExpr is remapped through this table to new actual value of the multiplier.

Time Use

Anim graph node restoring time from stash.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
TimeName Storage name
TimeType Specify type of restored time - either real or normalized.

Variables

Var Reset

Anim Node Var Set - sets variable values when defined conditions are met

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
VarReset List of variables to be reset to original game input
  • AnimSrcNodeVarResetItem
Property Description
VariableName No description
SetOnInit When enabled, variable is set on init (first frame)
SetOnMainPath When enabled, variable is set every frame on main path
SetOnBlendOut When enabled, variable is set every frame on secondary path (when blending out)

Var Set

Sets new value to variables when conditions are met. Changes apply only to child nodes.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
VarSet List of variables to be set to new value. Value is restored once returning to parent node.
  • AnimSrcNodeVarSetItem
Property Description
VariableName Variable name
SetOnInit When enabled, variable is set on init (first frame)
SetOnMainPath When enabled, variable is set every frame on main path
SetOnBlendOut When enabled, variable is set every frame on secondary path (when blending out)
PostEval When enabled, value is updated after child nodes, stored and applied for the subtree on next frame.
  • AnimSrcNodeVarSetBoolItem : AnimSrcNodeVarSetItem
    Change value of bool variable. Changes apply only to child nodes.
Property Description
Value New bool value
  • AnimSrcNodeVarSetIntItem : AnimSrcNodeVarSetItem
    Change value of int variable. Changes apply only to child nodes.
Property Description
Value New int value
  • AnimSrcNodeVarSetFloatItem : AnimSrcNodeVarSetItem
    Change value of float variable. Changes apply only to child nodes.
Property Description
Value New float value
  • AnimSrcNodeVarSetStringItem : AnimSrcNodeVarSetItem
    Change value of string variable. Changes apply only to child nodes.
Property Description
Value New string value

Var Update

Limit control variable updates by conditions, limit change rate. Changes apply only to child nodes. Example Usage: Freeze movement direction variable when blending out from a branch.

Property Description
Tags Tags set to animation output.
NodeGroup Name of parent node group, visual and logical aid.
Child Link to child node
VarUpdate List of variables with limited update rate. Limits apply only to child nodes.
  • AnimSrcNodeVarUpdateItem
Property Description
VariableName Identifier
UpdateOnInit When enabled, variable is updated on init (first frame)
UpdateOnMainPath When enabled, variable is updated every frame on main path
UpdateOnBlendOut When enabled, variable is updated every frame on secondary path (when blending out)
PostEval When enabled, value is updated after child nodes, stored and applied for the subtree on next frame.
Condition When filled in, variable is updated only when this condition is fulfilled.
MaxDifferencePerSecond Maximum difference of value per second. Variable value will not change faster below this node. Float variables only.
IsCyclic When enabled, variable might blend towards target 'the other way around' its range. Useful for example for motion direction angle.


See Also