Nodes/ComfyUI-Benripack/Benri Animation Extractor
ComfyUI Node

Benri Animation Extractor

Turn an animated .fbx model into a sprite-sheet tileset for consistent AI animation

By blackcodetavern·Created 2 years ago·Updated 2 years ago· 15
Benri Animation Extractor
  • model
  • animation
cols4
rows4
orientation

The name undersells it. Benri Animation Extractor doesn't "extract" anything from a video or a folder of frames - it renders an animated 3D model in your browser and tiles evenly-spaced snapshots of its animation into a single grid image. That grid is your keyframe tileset: the thing you feed into an img2img + ControlNet pipeline so you can restyle a consistent character into your art style, instead of prompting for pose after pose and watching the face drift.

It exists because character consistency is the classic unsolved problem - ask anyone what they fight with most and it's "the same face, the same body, ten different poses." One pragmatic answer is to stop prompting for poses and generate them all at once from a reference sheet you control. The pack's author built this exactly that way: grab a walk cycle from Mixamo, capture it on a 12x2 grid (24 frames at even time intervals), and let ControlNets - line, depth, pose, or all three together - do the restyling.

How it actually works

Here's the part that surprises people: the Python side of this node is almost a stub. It reads a PNG out of ComfyUI's temp folder and hands it to you as an IMAGE. All the real work happens in an iframe embedded in the node, rendered by Three.js with the FBXLoader pulled from a CDN. That has consequences:

  • The capture only runs while the ComfyUI tab is open in your browser. Headless or server-only runs produce nothing.
  • The first load needs internet - the Three.js scripts are loaded from cdnjs/jsdelivr, not bundled locally.
  • Every row×col cell is one frame of the model's animation clip, stepped at time = duration × index/(rows×cols). So the default 4×4 gives you 16 snapshots, one every 1/16 of the clip - exactly what the README promises.
  • Frames are captured from the WebGL canvas, tiled onto one grid canvas, uploaded to the temp folder, and only then does the Python node read them back.

Inputs and outputs that matter

The dropdowns are straightforward; you'll set three things:

  • rows and cols (INT, 1–20, default 4) - the grid, i.e. your frame count. 12x2 for a walk cycle, like the author's own setup.
  • orientation - Front, Back, Left, Right, or Rotate. The first four fix the model's yaw and play its animation clip; Rotate ignores the clip and spins the model 360° across the grid instead, which is your turnaround option.
  • model (MODEL_3D) - the wire from Benri Load 3D Model.

The single output, animation, is the tileset as an IMAGE. Send it to SaveImage to look at it, then into your img2img, ControlNet preprocessor, or upscale chain. The included example workflow is just Load3DModel → AnimationExtractor → SaveImage; the restyling is up to you.

Install

Either search "ComfyUI-Benripack" in ComfyUI Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/blackcodetavern/ComfyUI-Benripack

then restart ComfyUI. The requirements.txt is just torch, numpy, and Pillow - all already in a stock ComfyUI, so there's nothing to download and no model files. What you do need is a 3d_models folder in the ComfyUI root with your .fbx files, and for those to reach the browser viewer (see the Load3DModel page for the path gotcha).

Where people get burned

  • Empty or identical tiles. If the model has no animation clip, Front/Back/Left/Right just show the same pose from different angles. Use Rotate for a turnaround, or export an animated FBX.
  • Solid blue background. The renderer clears to flat blue (0x0000ff) before every frame. Every tile ships with that backdrop, so plan to key it out or cover it before ControlNet sees the image.
  • Don't go 20×20. That's 400 frames, each one a small canvas cell, and the whole grid is limited by your browser's canvas size. A 12x2 or 8x8 gets you detail; maxing both sliders gets you mush.
  • It re-executes every run. The node marks itself always-changed, which is fine interactively but means it re-renders even when nothing changed. If you just need the sheet once, save the output and move on.

It's a fiddly node - browser-bound rendering inside a graph is unusual, and it shows in edge cases. But there isn't a much easier free path from a Mixamo walk cycle to a pose tileset. The author's honest field notes: restyling worked best with SDXL; Flux understood the animation better but was far harder to get clean results from. Keep that in mind and it's a genuinely handy sprite-sheet factory.

Categorysd

Inputs (4)

NameTypeDefaultDescription
colsINT41–20
rowsINT41–20
orientationoptCOMBO5 options: Front, Back, Left, Right, Rotate
modeloptMODEL_3D

Outputs (1)

NameTypeDescription
animationIMAGE