FL Path Animator
Draw a motion path and get WAN ATI coordinates out
- image
- image
- mask
- coordinates
Directing motion in AI video is usually a matter of fighting text prompts until the subject drifts roughly where you wanted. FL_PathAnimator lets you just draw it. Open its editor, sketch a trajectory on a reference image, and the node animates a shape along that path frame by frame - and, more usefully, spits out a coordinate string formatted for WAN ATI so the motion you drew actually steers a Wan generation.
That's the real reason this node matters. It's not just a shape animator (though it is one); it's a friendly front-end for producing the point-track data that WAN ATI wants, without you hand-authoring JSON coordinates. You draw, it resamples to the 121 points ATI expects, you get a clean control signal.
How it works
The node pops a modal path editor over a reference image - the same pause-and-pick pattern as the pack's ImagePicker, where the workflow halts and waits for you to interact. You draw one or more paths; it then renders your chosen shape moving along them across the frame count, applying easing so the motion accelerates or eases as you set. Under the hood it resamples each path to 121 points, which is the length WAN ATI's coordinate format is built around, and emits that as a string alongside the rendered frames and a matching mask.
The inputs and outputs that matter
The required set defines the canvas and the shape: frame_width, frame_height, frame_count (how many frames the animation spans), shape (circle / square / triangle / hexagon / star), shape_size, and shape_color / bg_color as color strings.
The optionals you'll actually touch:
image(IMAGE) - the reference to draw your path over. Just the backdrop for the editor; it orients your trajectory.paths_data(STRING, JSON) - where the drawn path is stored. The editor fills this; you rarely edit it by hand.timeout_seconds(default 600) - how long it waits for you to finish drawing before giving up.trail_length,blur_radius,rotation_speed,border_width/border_color- cosmetic controls on the moving shape.
Three outputs: image (IMAGE, the animation frames), mask (MASK, the shape as a mask sequence), and the one that matters most - coordinates (STRING), the WAN ATI-ready point track. Wire that into your ATI motion input.
When you'd reach for it
Steering Wan video motion deliberately: an object arcing across frame, a camera-subject drift, a guided pan. The rendered shape/mask are also handy on their own as an animated matte. It lives in the pack's WIP section, so it's capable but still evolving.
Installing it
ComfyUI Manager → ComfyUI_Fill-Nodes → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-Nodes
then restart. It needs the pack's frontend (JS) assets for the modal editor, which come with the install - do a hard browser refresh after restarting if the editor doesn't show up.
Common issues & troubleshooting
The workflow just hangs. By design - it's paused waiting for you to draw a path in the modal and confirm. If the editor didn't pop, hard-refresh the browser so ComfyUI loads the node's UI. If you don't interact within timeout_seconds, it bails.
Coordinates don't drive the motion I expected. The coordinates output is specifically WAN ATI format (121 points). It has to feed an ATI-aware motion input; plugging it somewhere that expects a different control signal won't do what you want.
Path looks jerky in the output. Try a smoother easing and check your frame_count - too few frames across a long path means big jumps between points. More frames = smoother travel.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| frame_width | INT | 51264–4096 | — |
| frame_height | INT | 51264–4096 | — |
| frame_count | INT | 301–500 | — |
| shape | COMBO | circle | 5 options: circle, square, triangle, hexagon, star |
| shape_size | INT | 202–500 | — |
| shape_color | STRING | white | — |
| bg_color | STRING | black | — |
| blur_radiusopt | FLOAT | 0.00–50 | — |
| trail_lengthopt | FLOAT | 0.000–1 | — |
| rotation_speedopt | FLOAT | 0-360–360 | — |
| border_widthopt | INT | 00–20 | — |
| border_coloropt | STRING | white | — |
| paths_dataopt | STRING | {"paths": [], "canvas_size": {"width": 512, "height": 512}} | — |
| imageopt | IMAGE | — | |
| timeout_secondsopt | INT | 60030–3600 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| coordinates | STRING | — |