FBX → Preview3D (AnimoFlow)
Getting your animation to play in the ComfyUI viewport
- model_file
Every curated workflow in this pack ends the same way: a "Preview 3D & Animation" viewport where you can play and scrub your generated motion right on the canvas. AnimoFlow_FBXToPreview3D is the node that feeds that viewport. Its job looks trivial - "take this file and let the viewport load it" - but it's doing real work under the hood to make playback fast and cache-proof.
The built-in Preview3D node fetches files through ComfyUI's /api/view?type=output&filename=X endpoint, which means the file has to live in ComfyUI's output directory. This node copies the file there - and, here's the subtle part, renames it with a content-hash suffix so the URL changes on every new generation. That busts both ComfyUI's node cache (via IS_CHANGED) and the browser's HTTP cache, so a re-run actually shows the new animation instead of the stale one. It's the kind of plumbing detail that looks invisible until it's missing, and then it's a "why is my preview showing the old take" mystery.
The one wiring rule that matters
The README and the node source are both explicit: wire it from the GLB, not the rig FBX. The intended chain is:
AnimoFlow_GLBExport (glb_filename) → AnimoFlow_FBXToPreview3D (model_file) → Preview 3D & Animation
The GLB is the correct artifact to preview - snap-to-ground, brand tint, and trajectory restore are baked into it, and the raw rig FBX has none of that - and it's also the fast one: three.js parses GLB natively, while FBXLoader has to convert the whole scene graph in JavaScript and can stall the tab for many seconds on a Mixamo FBX. The input keeps its historical name fbx_filename for workflow compatibility, which is a little confusing when you're feeding it a GLB path, but that's deliberate - older workflows didn't break when the node's job evolved.
The fields
- fbx_filename - the path from
AnimoFlow_GLBExport(yes, the GLB path, despite the name). It's aSTRINGwithforceInput, so you can wire it from another node's output. - output_dir - where the source file lives, default
/tmp/animoflow-output. The node reads from there and copies into ComfyUI's output folder with the hash suffix.
Output is a single model_file STRING that plugs into the Preview3D viewport node.
Using it
It's a native node - no model, no containers, no Blender - so it's one of the few in the pack you can use to debug a workflow while the Docker backend is down, as long as a GLB already exists. Install is the standard nodes step (ComfyUI Manager, search "AnimoFlow", or git clone https://github.com/AnimoFlow/comfyui-animoflow.git into custom_nodes/); it uses ComfyUI's own folder_paths helper, so it's purely built-in dependent.
The only real gotcha is the naming trap: if you wire the rig FBX here because the input says fbx_filename, you'll get a preview that plays, but it's the unpolished motion - floating off the ground, no trajectory restore - and it may stutter in the browser on load. Feed it the GLB and both problems disappear. When you're deciding between preview paths, the stack is: AnimoFlow_PreviewMotion for raw-NPZ sanity checks, AnimoFlow_PreviewFBX for a quick rigged render, and this node for the real, polished, playable viewport.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| fbx_filename | STRING | — | |
| output_dir | STRING | /tmp/animoflow-output | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model_file | STRING | — |