What it does
One drawing of a character in, animated sprite sheets out. A front-view picture goes in; out come a walk, a short uppercut and a heavy uppercut as transparent sprite sheets at one scale, and the limbs never swap: the near arm and the near leg stay in front of the far ones on every frame.
This builds on my Posed Sprite Sheet Generator, which poses a character in a single image. That one stays as it is. This is a separate, much bigger setup: six steps, three models, my PoseCapture custom nodes for the pose part (since v2.1), a few Python scripts (limb labels, sprite sheets), and an exact bundle.
The posing step runs on Qwen-Image-Edit-2511 (bf16) with the 4-step Lightning LoRA.
The SCAIL animation step: a side-view still of the character plus a pose video made of 3D cylinders goes into SCAIL-Preview, and out comes an animation in which the near arm and the near leg stay in front of the far ones on every frame.
The cylinders are drawn with a depth buffer from a 2D skeleton track by my PoseCapture nodes, inside the SCAIL workflow (CPU, no model; PoseCapture, GitHub). Any move you can write as a skeleton can drive any character, and PoseCapture's workflow 1 makes a skeleton track from a video of a person.
The sprite sheet step:
make_sprite_sheet.pypacks the cut-out frames of every move into one transparent sheet at one scale, boots on one ground line, with a JSON of the frame order, so a game can switch between walk and punch without the character jumping or changing size. The cop's three sheets are included.Everything is exact: the workflows are the graphs that made the results, and every result was re-run from the download and compared pixel by pixel with the originals (max pixel difference 0, details in
README.mdin the zip). In v2.1 the PoseCapture nodes give exactly the v2.0 pose frames and padded stills (pixel-identical, re-run from the v2.1 zip on the CPU); the SCAIL renders were not re-run for v2.1.
Example character: the cop. His front-view drawing is AI-generated as well (an image model made it from a prompt, it is not hand-drawn), so the whole chain from picture to sprite sheet is AI. Three moves are included: walk, right-hand short uppercut, right-hand heavy uppercut.
Video walk through (five minutes, every step on screen):
Why cylinders
A flat skeleton has no front and no back. When two legs (or arms) overlap in a side view, the model has to guess which one is nearer, and it often guesses wrong: the far leg ends up in front, or the wrong arm throws the punch. A pose made of solid cylinders, rendered with a depth buffer, answers the question in the picture itself: the near limb covers the far limb.
The six steps
Motion reference to a DWPose skeleton. The walk was measured with DWPose from a reference video (the video itself is not included, only the skeleton). The two uppercuts were designed as skeletons in code, no video.
The grey mannequin performs the move, to check the motion before any character exists.
Reorient the character. Qwen-Image-Edit-2511 turns the front-view
Cop.pnginto a side-view still (a guard stance for the uppercuts, a walking stance for the walk). The workflows have the exact seeds (guard 1006, walk 3002).Fit and cylinders, inside the SCAIL workflow (PoseCapture nodes): DWPose the character picture, refit the skeleton to the character's proportions, render z-buffered cylinders = the SCAIL pose video, and pad the side still onto the pose figure's box.
SCAIL-Preview renders the cop: one workflow per move, Q8_0 GGUF, lightx2v step-distill LoRA, 8 steps, background cut out with BiRefNet.
The sprite sheet.
make_sprite_sheet.pyputs every frame of a move into a fixed transparent cell (768 x 896, ground line at 860) at the move's scale and writes the sheet plus a JSON with cell size, fps, ground line and frame order. Same cell for all three moves.
Proof: the limb-label check. A script draws R = near = orange and L = far = blue labels from the track on the mannequin and on the cop, frame by frame. Look at every frame; the labelled clips are attached.
What you need
ComfyUI 0.37 and the custom nodes listed in
MODELS.md(ComfyUI-GGUF, VideoHelperSuite, KJNodes, ComfyUI_BiRefNet_ll, comfyui_controlnet_aux, and PoseCapture: ComfyUI Manager, search "PoseCapture", orcomfy node install PoseCapture).Models (exact files, sizes and SHA-256 in
MODELS.md): SCAIL-Preview Q8_0 GGUF, lightx2v I2V 480p step/CFG distill LoRA, umt5-xxl fp8, Wan 2.1 VAE bf16 (Kijai's file), CLIP vision H, BiRefNet. For the optional Qwen step: Qwen-Image-Edit-2511 bf16, its Lightning 4-step LoRA, Qwen2.5-VL 7B fp8 text encoder, Qwen-Image VAE.Disk: about 27 GB for the SCAIL part, about 52 GB more for the Qwen part (optional: the two side stills are included).
Python 3.10+ with numpy and Pillow for the remaining scripts (limb labels, sprite sheets; no GPU).
Hardware I used: RTX 3080 10 GB, 62 GB RAM. SCAIL ran with ComfyUI started with
--lowvram --fast-disk(peak about 10 GB), Qwen with--fast-disk. About 10 minutes per clip at 768x768, 8 steps. The Qwen bf16 model needs a lot of system RAM or--fast-disk; about 3-4 minutes per still.
How to run it (reproduce the cop)
Unzip. Copy everything inside
inputs/ComfyUI_input/intoComfyUI/input/(flat names, so thatComfyUI/input/pss_cop_on_white.pngexists; the current ComfyUI editor only lists files that sit directly ininput/).Put the models in the ComfyUI folders named in
MODELS.md(sub-foldersscail/,wan/,qwen/matter, the workflows refer to them by name).Load
workflows/03a_scail_short_uppercut.json(or03bwalk,03cheavy uppercut) and press Run. Seed and all settings are fixed. The graph renders the cylinder pose frames on the CPU first (under a minute), then SCAIL. Results land inComfyUI/output/scail_cop/<move>/(white-background frames, cut-out frames, an mp4), the pose frames, params and fitted track in itspose/sub-folder.Compare with the videos on this page.
Workflows in the zip: 01a/01b (Qwen side still, guard and walk), 03a/03b/03c (pose part + SCAIL: short uppercut, walk, heavy uppercut). Each has a Note node with its step-by-step.
Your own character: make a front-view picture on plain white (768x1024), run 01a with your picture (say it plainly in the prompt: seen exactly from the side, facing right, empty bare fists, no weapon), copy the closest 03 workflow and change the character picture, the side still, the pad numbers (or the pad node's auto mode) and the costume sentence of the prompt, then run label_limbs.py and look at every frame. Your own move: make its skeleton track from a video with PoseCapture's workflow 1 and load it in the 03 workflow. The details are in the bundle's README.md.
Usage notes
No trigger word and no character LoRA: the character comes from the reference image.
The prompts name the cop's costume. For another character, rewrite that sentence and give it its own negative prompt (the cop wears boots, so "barefoot" is in his negative).
For the Qwen side-view step say it plainly in the prompt: seen exactly from the side, facing right, empty bare fists, no weapon.
Honest limits
Forearm smear on the fastest frames of the uppercuts (the arm moves several body widths between two frames).
Muddy boots where the two boots stack at the leg crossings.
The face sometimes shows a slight smile or gritted teeth instead of the closed mouth of the picture.
Late hands on the heavy uppercut: on the return to guard an open palm or an oversized fist appeared. Adding
both hands always normal-sized small closed fists, never an open handto the prompt andgiant hand, huge fist, oversized hand, enlarged fist, hand bigger than the headto the negative (open hand, open palm, spread fingerswere already in it) fixed it for this run ("prompt v2", used in workflow 03c).On the heavy uppercut's back turn (frames 36-43) the far fist is hidden behind the turned torso: not an order error, just hidden.
The limb order held on every frame I checked (limb-label videos are attached), but I only checked these three moves.
Different GPU, driver or ComfyUI version can change the floating point results slightly: same seed, same motion and look, not the same bytes.
Credits
SCAIL: Zai / Tsinghua authors (https://github.com/teal024/SCAIL-Official, weights https://huggingface.co/zai-org/SCAIL-Preview, arXiv 2512.05905). Q8_0 GGUF repack: vantagewithai. GGUF loader: city96.
Wan 2.1 (Wan-AI / Alibaba) with ComfyUI repackaging by Comfy-Org and Kijai; lightx2v step/CFG distillation LoRAs; Qwen-Image-Edit-2511 (Qwen team); BiRefNet (Zheng Peng et al., node by lldacing); DWPose (IDEA Research; conversions yzd-v, hr16; node pack Fannovel16); ComfyUI (comfyanonymous), VideoHelperSuite (Kosinkadink), KJNodes (Kijai).
Character: the cop (
Cop.png) is an AI-generated drawing, made with an image model from a prompt, not hand-drawn. I made it for this workflow as the example character.PoseCapture (the fit, cylinder and padding nodes): my node pack, https://github.com/Eloque/PoseCapture. Full list in
CREDITS.mdin the zip.
Licences
SCAIL-Preview: MIT on the Hugging Face card; the code repository (SCAIL-Official) ships Apache-2.0. The Q8_0 GGUF repack: MIT.
Wan 2.1 base, umt5, CLIP vision, lightx2v LoRAs, Qwen-Image-Edit-2511 and its Lightning LoRA, Qwen2.5-VL encoder, DWPose models: Apache-2.0. BiRefNet: MIT.
Full table with links in
LICENSES.mdin the zip.My own scripts (
scripts/*.py): MIT (the zip carries the LICENSE file). My PoseCapture nodes: GPL-3.0.The cop (
Cop.png, the stills, frames, videos and sheets): an AI-generated picture I made for this workflow, free to use in your own projects, credit appreciated but not required.
Attached files
Posed Sprite Sheet Generator V2.1.zip(about 61 MB, one zip, v2.1): the five workflows, the Python scripts (limb labels, sprite sheet, character centring), the inputs with flat names (the cop, the two side stills, the skeleton tracks), the reference pose frames, padded stills and fitted tracks that the pose nodes give for the cop, the example clips, the three sprite sheets with their JSON, README, MODELS (files, sizes, SHA-256), CREDITS, LICENSES.Posed Sprite Sheet Generator V2.zip(about 60 MB, one zip, v2.0): the six workflows, the Python scripts (fit, cylinder pose render, still padding, limb labels, sprite sheet), the inputs (the cop, the two side stills, the skeleton tracks, the ready-made cylinder pose frames for all three moves), the example clips, the three sprite sheets with their JSON, README, MODELS (files, sizes, SHA-256), CREDITS, LICENSES.Videos: the three cop moves (walk, short uppercut, heavy uppercut), the limb-label proof clips (cop and mannequin). Images: the cover and the three sprite-sheet previews.
Description
The pose part now runs as nodes, inside the SCAIL workflows. Same cop, same three moves (walk, right-hand short uppercut, right-hand heavy uppercut), same models and settings.
PoseCapture nodes instead of Python scripts. Workflows 03a/03b/03c now go from the move's skeleton track, the cop picture and his side-view still to the finished animation in one graph: Load Skeleton Track -> Fit Track to Character (with DWPose of the character inside the graph) -> Render SCAIL Cylinders = the pose video; Pad Still to Pose = the reference image. Install PoseCapture from the ComfyUI Manager (search "PoseCapture") or with
comfy node install PoseCapture; source https://github.com/Eloque/PoseCapture, Civitai https://civitai.com/models/3042084.Exactly the same input for SCAIL. On the cop the nodes give the V2.0 pose frames and padded stills pixel for pixel (187 / 187 pose frames and 3 / 3 stills, max difference 0; the fitted tracks byte-identical), checked on the CPU and re-run from this zip. Everything else in the SCAIL and Qwen graphs is unchanged, widget for widget.
Works in the current ComfyUI editor. V2.0's workflows used sub-folder input names (
scail_cop/...), which the current editor marks as missing inputs. V2.1 uses flat names: copy everything insideinputs/ComfyUI_input/intoComfyUI/input/.Your own move from a video: PoseCapture's workflow 1 turns a side-view video of a person into a skeleton track; load it in workflow 03.
Removed: workflow 02 (DWPose now runs inside 03) and the scripts
fit_track.py,scail_pose_from_track.py,prep_ref_pad.py(the nodes are the same code). Still scripts, because no node exists for them yet:make_sprite_sheet.py,label_limbs.py,label_mannequin.py,prep_character.py.Workflow 03 also saves the pose frames, the padded still, the camera numbers (params json, for the sprite-sheet scale and the limb labels) and the fitted track.
The example clips and sprite sheets are the V2.0 results (the SCAIL renders were not re-run for V2.1).



