Back to Guide
Guide

Animation

Drive parameters and images over time and bake the frames into a sprite sheet. All timing is frame-based ("one swing per 8 frames"); seconds appear only as converted hints.

The easiest way: move a whole image

Select any node with an image output and press "🎞️ Animate this whole image" in the inspector.

  • A Sprite Motion node (sprite_motion) is wired automatically; pick the motion (move / ping-pong / rotate / bounce / wobble / blink / float / random), amount (px / deg) and period (frames) right there
  • Wiring by hand is just image → sprite_motion → animation_render

Animating a parameter: the animation button

Press the 🎞️ button on any numeric parameter row and that parameter moves.

  • A motion node is auto-created and wired behind the scenes (visible in the graph)
  • The inline editor below the parameter adjusts motion / amount / period / easing
  • "Detach as node" graduates it into a regular node for advanced wiring

Previews and sheet baking

  • ▶ buttons: whenever something time-dependent is upstream, play a provisional preview in the inspector, on the node thumbnail, or in the viewer (captured on demand only; concurrent node playback is configurable, default 3)
  • "Convert to spritesheet": one click wires an animation_render. Configurations with unstable canvas sizes are warned about beforehand, and errors offer a fix action that sets upstream renders to FixedCanvas

Project animation defaults

The 🎬 anim defaults (frames × FPS) in the canvas bar are the project-wide baseline. Frame counts and FPS left at 0 follow the defaults automatically and are stored in the .ppl, so the same project renders the same sheets anywhere.

Advanced: combining motions and staggering

  • motion outputs a plain Float — combine with math nodes (wobble + random, ...)
  • remap / ease_in_out remain general-purpose Float utilities
  • stagger hands out per-element frame shifts; distribute them with list_map for grass swaying in sequence or follow-through on parts
  • time_source still exposes raw frame numbers for expert use

Motion vs keyframes

Motion (rules) Keyframes (poses)
Strength periodic, mechanical movement one-off acting (wind-up, follow-through)
Editing change one number re-pose the keys
Nodes motion / sprite_motion keyframe_clip + dedicated editor

Neither replaces the other. Keyframe clips are also frame-based and follow the project default FPS; see the keyframe_clip node manual for details.

Common pitfalls

  • Only one frame moves: nothing is driving the parameter — use the 🎞️ button
  • A hitch at the loop seam: legacy symptom; motion nodes handle loop endpoints automatically. Hand-written expressions should use frame/total for the phase
  • Per-frame move does not loop: the value keeps accumulating; use looping motions or sprite_motion's Wrap
  • Sheet layout looks wrong: check columns; 0 means auto layout

The bundled sample (workflows/model_chest_animation_c7.ppl) drives the chest lid with motion (ping-pong) → model transform X rotation, and animation_render packs six frames into a sprite sheet.

The chest-opening sample project with animation_render selected and playing

Animation — PixPipeline User Guide