Power Spline Editor (QQ)
The canvas node that lets you draw the motion Wan should follow
- bg_image
- ref_images
- bg_image
- coord_out
- frames
- debug_scale
This is the pack's flagship, and the node the author (u/sir_axe) is actually known for - his TTM timeline-integration showcase drew a couple hundred upvotes and the "what is this blackmagic" reactions that custom-node devs live for. PowerSplineEditor is a full canvas-based path editor inside a single ComfyUI node. You draw splines on a background, animate them over frames, and it spits out per-frame coordinates that you feed into Wan motion/control pipelines - think TTM physics, object movement, camera moves, or VACE control. It's marked "WIP" in the code, which should tell you both that it's ambitious and that you're riding the bleeding edge.
The mechanism is straightforward once you see it: you define paths as points in the node's canvas, the node interpolates them across the requested frames count (linear, plus cardinal/Catmull-Rom, basis/B-spline, and static "points" modes), and emits the resulting coordinate sequence as coord_out (a STRING). Other nodes in the pack - DrawShapeOnPath, DrawImageOnPath - consume those coordinates to render what the motion looks like, and then the coordinates or rendered frames drive the actual Wan pipeline via the wrapper's TTM/move nodes. The README's example workflows (rabbit_control_wan_move, ttm) show exactly this chain.
The inputs that matter
- points_store - the path data as JSON (the canvas writes this for you; don't hand-edit unless you know the format).
- coordinates - a string you can also feed in from elsewhere, e.g. to replay a path another node generated.
- mask_width / mask_height - the working canvas resolution (default 640×480).
- bg_opacity (0–1) - background brightness in the editor preview.
- bg_image / ref_images (optional) - a background image to draw over, and reference images (e.g. a character cut-out) to preview against.
- frames (optional) - how many frames to interpolate the path over.
Outputs: bg_image (the composed editor preview), coord_out (the per-frame coordinate string - the thing you actually use downstream), frames (echoed), and debug_scale (a diagnostic string for when coordinates look wrong).
The features people actually use
Multi-layer canvas with per-layer controls, interpolation modes, a repeat system with closed-path handling for loops, easing functions, driver/driven paths (one path controls another with rotation, scaling, smoothing), offset timing with pause frames, and the timeline hotkeys (Shift+Spacebar play/pause, Shift+Drag on the [/] markers to adjust loop boundaries). There's also a backend Canvas button that triggers reference prep without starting a ComfyUI run. It's a lot, and honestly the learning curve is real - but this is the rare custom node with an actual interactive UI, which makes iterating on camera moves dramatically faster than typing coordinates.
Installing it
Ships in siraxe/ComfyUI-WanVideoWrapper_QQ. ComfyUI Manager → search WanVideoWrapper_QQ/SA-Nodes-QQ, or:
cd ComfyUI/custom_nodes
git clone https://github.com/siraxe/ComfyUI-WanVideoWrapper_QQ.git
Restart ComfyUI. You'll also want Kijai's ComfyUI-WanVideoWrapper installed (the pack's README says it's required; the TTM/move nodes live in that world), plus cv2 (pip install opencv-python) if you use the reference-prep features.
Gotchas
- WIP means WIP. The node has been through heavy refactors (hand-drawn spline layers, driver/driven, independent layer point control). If a downloaded workflow references an older layout, update and re-save.
- Coordinate scale.
debug_scaleexists because coordinates can silently be in the wrong canvas space when you change resolution - always checkcoord_outagainst your actual frame size before running a long Wan pass. - Pack note: the repo was renamed to ComfyUI-SA-Nodes-QQ in v1.3.4; delete any stale
wanwrapper_qqfolder incustom_nodesif old workflows point at it.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| points_store | STRING | [{"x":200,"y":240},{"x":304,"y":240}] | — |
| coordinates | STRING | — | |
| mask_width | INT | 6408–4096 | — |
| mask_height | INT | 4808–4096 | — |
| bg_opacity | FLOAT | 1.000–1 | Background opacity (0 = black, 1 = full brightness) |
| bg_imageopt | IMAGE | — | |
| ref_imagesopt | IMAGE | — | |
| framesopt | INT | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| bg_image | IMAGE | — |
| coord_out | STRING | — |
| frames | INT | — |
| debug_scale | STRING | — |