Animation Editor: Nodes – Arma Reforger
Lou Montana (talk | contribs) m (Text replacement - "ize " to "ise ") |
Lou Montana (talk | contribs) (Update to 1.2.1) |
||
Line 1: | Line 1: | ||
{{TOC|side}} | {{TOC|side}} | ||
An '''animation node''' is a fundamental block of | 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 | '''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 | '''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 | ('''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: | ||
|} | |} | ||
=== | === 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. | |||
{| 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. | |||
|} | |||
=== 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 70: | Line 85: | ||
! Description | ! 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. | |||
{| 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. | |||
|} | |||
==== 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 | ||
|- | |- | ||
| | | 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. | |||
{| 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. | |||
|} | |} | ||
=== | ==== Blend TW ==== | ||
Time dependent blend between two child nodes. Unlike BlendT which utilizes thresholds, Blend TW blends towards target value. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 108: | Line 240: | ||
! Description | ! 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. | |||
{| 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. | |||
''' | * '''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 | |||
|} | |||
==== Switch ==== | |||
Plays child nodes and switches to next one randomly, once they finish playing. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 131: | Line 355: | ||
! Description | ! 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''' | |||
: {| class="wikitable" | |||
! 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. | |||
{ | {| 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. | |||
|} | |||
==== Buffer Use ==== | |||
Restore previously saved pose buffer from temporary storage. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 150: | Line 415: | ||
! Description | ! 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. | |||
{| 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 | |||
|- | |||
| 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. | |||
{| 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. | |||
|} | |||
==== 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 | ||
|- | |- | ||
| | | 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). | |||
{| 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. | |||
|- | |||
| 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 | |||
|- | |- | ||
| ''' | | 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. | |||
{| 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) | |||
|} | |||
==== 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. | |||
''' | {| class="wikitable" | ||
! 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. | |||
{| 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. | |||
|} | |||
=== 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". | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 222: | Line 643: | ||
! Description | ! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 250: | Line 668: | ||
! Description | ! 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''' | ||
: {| class="wikitable" | |||
! Property | |||
! Description | |||
|- | |||
| IkTarget | |||
| IK target name | |||
|- | |||
| IkChain | |||
| IK chain name | |||
|} | |} | ||
|- | |||
| Solver | |||
| Select an instance of IK solver to run. | |||
=== | * '''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. | |||
|} | |||
==== IK2 Plane ==== | |||
Computes inverse kinematics on a chain to reach target plane. Target planes are set by application (character/gameplay programmers). | |||
{| 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. | |||
|} | |||
==== IK2 Target ==== | |||
Creates an ik target from model-space position of a bone or end effector of a chain. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 282: | Line 809: | ||
! Description | ! 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''' | |||
: {| 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. | |||
= | * '''AnimSrcIkTargetBinding''' | ||
: {| class="wikitable" | |||
! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 299: | Line 925: | ||
! Description | ! 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''' | |||
: {| class="wikitable" | |||
! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 311: | Line 973: | ||
! Description | ! 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''' | |||
: {| class="wikitable" | |||
! Property | |||
! Description | |||
|- | |- | ||
| | | IkTarget | ||
| | | IK target name | ||
|- | |||
| IkChain | |||
| IK chain name | |||
|} | |} | ||
|} | |} | ||
=== | ==== RBF ==== | ||
''No description'' | |||
''' | {| 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'' | |||
|} | |||
==== 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. | |||
{| 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 | |||
|} | |||
=== | === 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. | |||
{| class="wikitable" | |||
! 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'' | |||
{| 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. | |||
|} | |||
|} | |||
==== Procedural ==== | |||
AnimNodeProcTransform applies procedural transform on a set of joints or IK targets through entered expressions. | |||
=== | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 369: | Line 1,203: | ||
! Description | ! 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 | |||
: {| 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 | |||
|- | |- | ||
| | | 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 379: | Line 1,284: | ||
! Description | ! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 414: | Line 1,309: | ||
! Description | ! 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 | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 422: | Line 1,328: | ||
! Description | ! 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. | |||
{| class="wikitable" | |||
! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 466: | Line 1,376: | ||
! Description | ! 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 | | List of sampled predictions (future bone transforms in the animation) | ||
{| class="wikitable" | * AnimSrcNodePrediction | ||
: {| class="wikitable" | |||
! Property | ! Property | ||
! Description | ! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 495: | Line 1,435: | ||
! Description | ! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
! Property | ! Property | ||
! Description | ! 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''' | |||
: {| 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). | |||
|} | |} | ||
=== | === 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 532: | Line 1,518: | ||
! Description | ! 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 542: | Line 1,543: | ||
! Description | ! Description | ||
|- | |- | ||
| ''' | | States | ||
| identifier of | | 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 | |||
|- | |- | ||
| | | 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. | |||
{| 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 | |||
|- | |||
| 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 | ||
|- | |- | ||
| | | 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. | |||
{| 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 | ||
|- | |- | ||
| | | 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. | |||
{| 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 | |||
|- | |- | ||
| | | 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 | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 613: | Line 1,755: | ||
! Description | ! Description | ||
|- | |- | ||
| | | Tags | ||
| | | Tags set to animation output. | ||
|- | |- | ||
| | | NodeGroup | ||
| | | Name of parent node group, visual and logical aid. | ||
|- | |- | ||
| | | 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 | ||
|- | |- | ||
| | | 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. | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 660: | Line 1,792: | ||
! Description | ! Description | ||
|- | |- | ||
| | | Tags | ||
| Name of | | 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 | |||
|- | |- | ||
| | | 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<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 | |||
|} | |||
|} | |} | ||
=== | ==== 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. | |||
{| 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. | |||
* '''AnimSrcNodeVarUpdateItem''' | |||
: {| class="wikitable" | |||
! 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 == | == See Also == | ||
* | * {{Link|Arma Reforger:Animation Editor}} | ||
* | * {{Link|Arma Reforger:Animation Editor: State Machine}} | ||
* | * {{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.
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.
| ||||||||||||||||||||||||||
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.
|
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
|
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.
| ||||||||||||||||||||||||||||||
Solver | Select an instance of IK solver to run.
|
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.
| ||||||
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.
| ||||||||||||||||||||||||||
ModelSpaceOffset | Offset applied to chain in model space (unaffected by parent transforms)
| ||||||||||||||||||||||||||
Bones | List of ik targets to be be created and assigned transform from specified model-space transforms of bones.
|
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
|
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
|
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
|
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
| ||||||||||||||||
IkTargets | List of operations on IK targets
|
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)
| ||||||||||||||||
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)
| ||||||||||||||||
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.
| ||||||||||||||||||||||||||||||||||||||||||||||||||
Transitions | List of transitions inside state machine.
|
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
|
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.
|
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.
|