animation_tree.rst 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. .. _doc_animation_tree:
  2. Using AnimationTree
  3. ===================
  4. Introduction
  5. ------------
  6. With :ref:`AnimationPlayer <class_AnimationPlayer>`, Godot has one of the most flexible animation systems that you can find in any game engine.
  7. The ability to animate almost any property in any node or resource, as well as having dedicated transform, bezier,
  8. function calling, audio and sub-animation tracks, is pretty much unique.
  9. However, the support for blending those animations via ``AnimationPlayer`` is relatively limited, as only a fixed cross-fade transition time can be set.
  10. Creating an AnimationTree
  11. -------------------------
  12. Before starting, it must be made clear that an ``AnimationTree`` node does not contain its own animations.
  13. Instead, it uses animations contained in an ``AnimationPlayer`` node. This way, you can edit your animations (or import them from a 3D scene)
  14. as usual and then use this extra node to control the playback.
  15. The most common way to use ``AnimationTree`` is in a 3D scene. When importing your scenes from a 3D exchange format, they will usually come
  16. with animations built-in (either multiple ones or split from a large one on import).
  17. At the end, the imported Godot scene will contain the animations in a ``AnimationPlayer`` node.
  18. As you rarely use imported scenes directly in Godot (they are either instantiated or inherited from), you can place the ``AnimationTree`` node in your
  19. new scene which contains the imported one. Afterwards, point the ``AnimationTree`` node to the ``AnimationPlayer`` that was created in the imported scene.
  20. This is how it's done in the `Third Person Shooter demo <https://github.com/godotengine/tps-demo>`_, for reference:
  21. .. image:: img/animtree1.png
  22. A new scene was created for the player with a ``CharacterBody3D`` as root. Inside this scene, the original ``.dae`` (Collada) file was instantiated
  23. and an ``AnimationTree`` node was created.
  24. Creating a tree
  25. ---------------
  26. There are three main types of nodes that can be used in ``AnimationTree``:
  27. 1. Animation nodes, which reference an animation from the linked ``AnimationPlayer``.
  28. 2. Animation Root nodes, which are used to blend sub-nodes.
  29. 3. Animation Blend nodes, which are used within ``AnimationNodeBlendTree`` as single-graph blending via multiple input ports.
  30. To set a root node in ``AnimationTree``, a few types are available:
  31. .. image:: img/animtree2.png
  32. * ``AnimationNodeAnimation``: Selects an animation from the list and plays it. This is the simplest root node, and generally not used directly as root.
  33. * ``AnimationNodeBlendTree``: Contains many *blend* type nodes, such as mix, blend2, blend3, one shot, etc. This is one of the most commonly used roots.
  34. * ``AnimationNodeStateMachine``: Contains multiple root nodes as children in a graph. Each node is used as a *state*, and provides multiple functions to alternate between states.
  35. * ``AnimationNodeBlendSpace2D``: Allows placing root nodes in a 2D blend space. Control the blend position in 2D to mix between multiple animations.
  36. * ``AnimationNodeBlendSpace1D``: Simplified version of the above (1D).
  37. Blend tree
  38. ----------
  39. An ``AnimationNodeBlendTree`` can contain both root and regular nodes used for blending. Nodes are added to the graph from a menu:
  40. .. image:: img/animtree3.webp
  41. All blend trees contain an ``Output`` node by default, and something has to be connected to it in order for animations to play.
  42. The easiest way to test this functionality is to connect an ``Animation`` node to it directly:
  43. .. image:: img/animtree4.png
  44. This will simply play back the animation. Make sure that the ``AnimationTree`` is active for something to actually happen.
  45. Following is a short description of available nodes:
  46. Blend2 / Blend3
  47. ^^^^^^^^^^^^^^^
  48. These nodes will blend between two or three inputs by a user-specified blend value:
  49. .. image:: img/animtree5.gif
  50. For more complex blending, it is advised to use blend spaces instead.
  51. Blending can also use filters, i.e. you can control individually which tracks go through the blend function.
  52. This is very useful for layering animations on top of each other.
  53. .. image:: img/animtree6.png
  54. OneShot
  55. ^^^^^^^
  56. This node will execute a sub-animation and return once it finishes. Blend times for fading in and out can be customized, as well as filters.
  57. .. image:: img/animtree6b.gif
  58. After setting the request and changing the animation playback, the one-shot node automatically clears the request on the next process frame by setting its ``request`` value to ``AnimationNodeOneShot.ONE_SHOT_REQUEST_NONE``.
  59. .. tabs::
  60. .. code-tab:: gdscript GDScript
  61. # Play child animation connected to "shot" port.
  62. animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE)
  63. # Alternative syntax (same result as above).
  64. animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_FIRE
  65. # Abort child animation connected to "shot" port.
  66. animation_tree.set("parameters/OneShot/request", AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT)
  67. # Alternative syntax (same result as above).
  68. animation_tree["parameters/OneShot/request"] = AnimationNodeOneShot.ONE_SHOT_REQUEST_ABORT
  69. # Get current state (read-only).
  70. animation_tree.get("parameters/OneShot/active"))
  71. # Alternative syntax (same result as above).
  72. animation_tree["parameters/OneShot/active"]
  73. .. code-tab:: csharp
  74. // Play child animation connected to "shot" port.
  75. animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Fire);
  76. // Abort child animation connected to "shot" port.
  77. animationTree.Set("parameters/OneShot/request", (int)AnimationNodeOneShot.OneShotRequest.Abort);
  78. // Get current state (read-only).
  79. animationTree.Get("parameters/OneShot/active");
  80. TimeSeek
  81. ^^^^^^^^
  82. This node can be used to cause a seek command to happen to any sub-children of the animation graph. Use this node type to play an ``Animation`` from the start or a certain playback position inside the ``AnimationNodeBlendTree``.
  83. After setting the time and changing the animation playback, the seek node automatically goes into sleep mode on the next process frame by setting its ``seek_request`` value to ``-1.0``.
  84. .. tabs::
  85. .. code-tab:: gdscript GDScript
  86. # Play child animation from the start.
  87. animation_tree.set("parameters/TimeSeek/seek_request", 0.0)
  88. # Alternative syntax (same result as above).
  89. animation_tree["parameters/TimeSeek/seek_request"] = 0.0
  90. # Play child animation from 12 second timestamp.
  91. animation_tree.set("parameters/TimeSeek/seek_request", 12.0)
  92. # Alternative syntax (same result as above).
  93. animation_tree["parameters/TimeSeek/seek_request"] = 12.0
  94. .. code-tab:: csharp
  95. // Play child animation from the start.
  96. animationTree.Set("parameters/TimeSeek/seek_request", 0.0);
  97. // Play child animation from 12 second timestamp.
  98. animationTree.Set("parameters/TimeSeek/seek_request", 12.0);
  99. TimeScale
  100. ^^^^^^^^^
  101. Allows scaling the speed of the animation (or reverse it) connected to the `in` input via the `scale` parameter. Setting the `scale` to 0 will pause the animation.
  102. Transition
  103. ^^^^^^^^^^
  104. Very simple state machine (when you don't want to cope with a ``StateMachine`` node). Animations can be connected to the outputs and transition times can be specified.
  105. After setting the request and changing the animation playback, the transition node automatically clears the request on the next process frame by setting its ``transition_request`` value to an empty string (``""``).
  106. .. tabs::
  107. .. code-tab:: gdscript GDScript
  108. # Play child animation connected to "state_2" port.
  109. animation_tree.set("parameters/Transition/transition_request", "state_2")
  110. # Alternative syntax (same result as above).
  111. animation_tree["parameters/Transition/transition_request"] = "state_2"
  112. # Get current state name (read-only).
  113. animation_tree.get("parameters/Transition/current_state")
  114. # Alternative syntax (same result as above).
  115. animation_tree["parameters/Transition/current_state"]
  116. # Get current state index (read-only).
  117. animation_tree.get("parameters/Transition/current_index"))
  118. # Alternative syntax (same result as above).
  119. animation_tree["parameters/Transition/current_index"]
  120. .. code-tab:: csharp
  121. // Play child animation connected to "state_2" port.
  122. animationTree.Set("parameters/Transition/transition_request", "state_2");
  123. // Get current state name (read-only).
  124. animationTree.Get("parameters/Transition/current_state");
  125. // Get current state index (read-only).
  126. animationTree.Get("parameters/Transition/current_index");
  127. BlendSpace2D
  128. ^^^^^^^^^^^^
  129. ``BlendSpace2D`` is a node to do advanced blending in two dimensions. Points are added to a two-dimensional space and then a position
  130. can be controlled to determine blending:
  131. .. image:: img/animtree7.gif
  132. The ranges in X and Y can be controlled (and labeled for convenience). By default, points can be placed anywhere (right-click on
  133. the coordinate system or use the *add point* button) and triangles will be generated automatically using Delaunay.
  134. .. image:: img/animtree8.gif
  135. It is also possible to draw the triangles manually by disabling the *auto triangle* option, though this is rarely necessary:
  136. .. image:: img/animtree9.png
  137. Finally, it is possible to change the blend mode. By default, blending happens by interpolating points inside the closest triangle.
  138. When dealing with 2D animations (frame by frame), you may want to switch to *Discrete* mode.
  139. Alternatively, if you want to keep the current play position when switching between discrete animations, there is a *Carry* mode.
  140. This mode can be changed in the *Blend* menu:
  141. .. image:: img/animtree10.png
  142. BlendSpace1D
  143. ^^^^^^^^^^^^
  144. This is similar to 2D blend spaces, but in one dimension (so triangles are not needed).
  145. StateMachine
  146. ^^^^^^^^^^^^
  147. This node acts as a state machine with root nodes as states. Root nodes can be created and connected via lines. States are connected via *Transitions*,
  148. which are connections with special properties. Transitions are uni-directional, but two can be used to connect in both directions.
  149. .. image:: img/animtree11.gif
  150. There are many types of transition:
  151. .. image:: img/animtree12.png
  152. * *Immediate*: Will switch to the next state immediately. The current state will end and blend into the beginning of the new one.
  153. * *Sync*: Will switch to the next state immediately, but will seek the new state to the playback position of the old state.
  154. * *At End*: Will wait for the current state playback to end, then switch to the beginning of the next state animation.
  155. Transitions also have a few properties. Click any transition and it will be displayed in the inspector dock:
  156. .. image:: img/animtree13.png
  157. * *Switch Mode* is the transition type (see above), it can be modified after creation here.
  158. * *Auto Advance* will turn on the transition automatically when this state is reached. This works best with the *At End* switch mode.
  159. * *Advance Condition* will turn on auto advance when this condition is set. This is a custom text field that can be filled with a variable name.
  160. The variable can be modified from code (more on this later).
  161. * *Xfade Time* is the time to cross-fade between this state and the next.
  162. * *Priority* is used together with the ``travel()`` function from code (more on this later). Lower priority transitions are preferred when travelling through the tree.
  163. * *Disabled* toggles disabling this transition (when disabled, it will not be used during travel or auto advance).
  164. For better blending
  165. -------------------
  166. In Godot 4.0+, in order for the blending results to be deterministic (reproducible and always consistent),
  167. the blended property values must have a specific initial value.
  168. For example, in the case of two animations to be blended, if one animation has a property track and the other does not,
  169. the blended animation is calculated as if the latter animation had a property track with the initial value.
  170. When using Position/Rotation/Scale 3D tracks for Skeleton3D bones, the initial value is Bone Rest.
  171. For other properties, the initial value is ``0`` and if the track is present in the ``RESET`` animation,
  172. the value of its first keyframe is used instead.
  173. For example, the following AnimationPlayer has two animations, but one of them lacks a Property track for Position.
  174. .. image:: img/blending1.webp
  175. This means that the animation lacking that will treat those Positions as ``Vector2(0, 0)``.
  176. .. image:: img/blending2.webp
  177. This problem can be solved by adding a Property track for Position as an initial value to the ``RESET`` animation.
  178. .. image:: img/blending3.webp
  179. .. image:: img/blending4.webp
  180. .. note:: Be aware that the ``RESET`` animation exists to define the default pose when loading an object originally.
  181. It is assumed to have only one frame and is not expected to be played back using the timeline.
  182. Also keep in mind that the Rotation 3D tracks and the Property tracks for 2D rotation
  183. with Interpolation Type set to Linear Angle or Cubic Angle will prevent rotation of more than 180 degrees
  184. from the initial value as blended animation.
  185. This can be useful for Skeleton3Ds to prevent the bones penetrating the body when blending animations.
  186. Therefore, Skeleton3D's Bone Rest values should be as close to the midpoint of the movable range as possible.
  187. **This means that for humanoid models, it is preferable to import them in a T-pose**.
  188. .. image:: img/blending5.webp
  189. You can see that the shortest rotation path from Bone Rests is prioritized rather than the shortest rotation path between animations.
  190. If you need to rotate Skeleton3D itself more than 180 degrees by blend animations for movement, you can use Root Motion.
  191. Root motion
  192. -----------
  193. When working with 3D animations, a popular technique is for animators to use the root skeleton bone to give motion to the rest of the skeleton.
  194. This allows animating characters in a way where steps actually match the floor below. It also allows precise interaction with objects during cinematics.
  195. When playing back the animation in Godot, it is possible to select this bone as the *root motion track*. Doing so will cancel the bone
  196. transformation visually (the animation will stay in place).
  197. .. image:: img/animtree14.png
  198. Afterwards, the actual motion can be retrieved via the :ref:`AnimationTree <class_AnimationTree>` API as a transform:
  199. .. tabs::
  200. .. code-tab:: gdscript GDScript
  201. # Get the motion delta.
  202. animation_tree.get_root_motion_position()
  203. animation_tree.get_root_motion_rotation()
  204. animation_tree.get_root_motion_scale()
  205. # Get the actual blended value of the animation.
  206. animation_tree.get_root_motion_position_accumulator()
  207. animation_tree.get_root_motion_rotation_accumulator()
  208. animation_tree.get_root_motion_scale_accumulator()
  209. .. code-tab:: csharp
  210. // Get the motion delta.
  211. animationTree.GetRootMotionPosition();
  212. animationTree.GetRootMotionRotation();
  213. animationTree.GetRootMotionScale();
  214. // Get the actual blended value of the animation.
  215. animationTree.GetRootMotionPositionAccumulator();
  216. animationTree.GetRootMotionRotationAccumulator();
  217. animationTree.GetRootMotionScaleAccumulator();
  218. This can be fed to functions such as :ref:`CharacterBody3D.move_and_slide <class_CharacterBody3D_method_move_and_slide>` to control the character movement.
  219. There is also a tool node, ``RootMotionView``, that can be placed in a scene and will act as a custom floor for your
  220. character and animations (this node is disabled by default during the game).
  221. .. image:: img/animtree15.gif
  222. Controlling from code
  223. ---------------------
  224. After building the tree and previewing it, the only question remaining is "How is all this controlled from code?".
  225. Keep in mind that the animation nodes are just resources and, as such, they are shared between all instances using them.
  226. Setting values in the nodes directly will affect all instances of the scene that uses this ``AnimationTree``.
  227. This is generally undesirable, but does have some cool use cases, e.g. you can copy and paste parts of your animation tree,
  228. or reuse nodes with a complex layout (such as a state machine or blend space) in different animation trees.
  229. The actual animation data is contained in the ``AnimationTree`` node and is accessed via properties.
  230. Check the "Parameters" section of the ``AnimationTree`` node to see all the parameters that can be modified in real-time:
  231. .. image:: img/animtree16.png
  232. This is handy because it makes it possible to animate them from an ``AnimationPlayer``, or even the ``AnimationTree`` itself,
  233. allowing the realization of very complex animation logic.
  234. To modify these values from code, the property path must be obtained. This is done easily by hovering the mouse over any of the parameters:
  235. .. image:: img/animtree17.png
  236. Which allows setting them or reading them:
  237. .. tabs::
  238. .. code-tab:: gdscript GDScript
  239. animation_tree.set("parameters/eye_blend/blend_amount", 1.0)
  240. # Simpler alternative form:
  241. animation_tree["parameters/eye_blend/blend_amount"] = 1.0
  242. .. code-tab:: csharp
  243. animationTree.Set("parameters/eye_blend/blend_amount", 1.0);
  244. State machine travel
  245. --------------------
  246. One of the nice features in Godot's ``StateMachine`` implementation is the ability to travel. The graph can be instructed to go from the
  247. current state to another one, while visiting all the intermediate ones. This is done via the A\* algorithm.
  248. If there is no path of transitions starting at the current state and finishing at the destination state, the graph teleports to the destination state.
  249. To use the travel ability, you should first retrieve the :ref:`AnimationNodeStateMachinePlayback <class_AnimationNodeStateMachinePlayback>`
  250. object from the ``AnimationTree`` node (it is exported as a property).
  251. .. tabs::
  252. .. code-tab:: gdscript GDScript
  253. var state_machine = animation_tree["parameters/playback"]
  254. .. code-tab:: csharp
  255. AnimationNodeStateMachinePlayback stateMachine = (AnimationNodeStateMachinePlayback)animationTree.Get("parameters/playback");
  256. Once retrieved, it can be used by calling one of the many functions it offers:
  257. .. tabs::
  258. .. code-tab:: gdscript GDScript
  259. state_machine.travel("SomeState")
  260. .. code-tab:: csharp
  261. stateMachine.Travel("SomeState");
  262. The state machine must be running before you can travel. Make sure to either call ``start()`` or choose a node to **Autoplay on Load**.
  263. .. image:: img/animtree18.png