Three Play Animation
Make that rigged character actually walk
- object
- animated
You can load a rigged character into a Three scene with WASThreeLoadModel and it'll stand there in its bind pose, frozen mid-T, which is not a great look. WASThreePlayAnimation is the node that takes the animation clips already saved inside the model file and actually plays them - the walk cycle runs, the character walks. It's how the Three family handles animation without you hand-keying a single frame.
How it works
Animation clips live inside model files. Three Play Animation reads the clips a .glb, .gltf, .dae or .fbx carries - the formats that rigged characters come in. An .obj, .stl, .ply or .3mf carries no clips, so there's nothing to play, which is worth knowing before you spend an hour wondering why a static mesh won't move.
The clip field picks which clip to play, by name ("Walk") or by number ("0"). Leave it empty and it plays the first one. Give it a name the model doesn't have and you get an error that helpfully names every clip the file does carry.
The inputs that matter
The interesting part is units, which controls how a clip maps onto time:
- per second - the clip runs at its authored speed. 1.0
speedis the natural rate, 0.5 is half, negative runs it backwards. - per capture - one pass of the clip is spread across the whole render, so a walk cycle fills the batch whatever its frame count. No arithmetic: your walk fills the clip end to end.
- per timeline - spread across Three App's
loop_secondsinstead, and the render then captures a window out of that longer loop. This is how you take a part of a long walk rather than refitting the whole thing.
offset is seconds into the clip the run starts at. The killer use for it is crowds: give three copies offsets of 0.0, 0.4 and 0.8 and a line of clones doesn't march in step. loop sets the tail behavior - repeat starts again, once holds the last pose, ping pong runs it backwards and forwards.
A subtle thing to appreciate
The pose is worked out from the moment alone - the node evaluates the animation at a point in time rather than accumulating motion frame by frame. So a frame drawn twice comes out identical both times, which makes renders deterministic and re-rendering a mid-animation frame safe. That's the kind of property that saves you from hair-pulling in video work.
Where it fits
The output is an animated object that replaces the loaded model in the group. Character flow: Three Load Model → Three Play Animation → Three Group, alongside your lights, then scene → Three App → Three Render. The pack ships a three-skinned-model.json workflow demonstrating exactly this.
Install
WASThreePlayAnimation ships with WAS Node Suite v3. Install via ComfyUI Manager (search WAS Node Suite v3) or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
Restart after. Requires ComfyUI 0.14.0+ and Python 3.10+. If the node's absent from Add Node, check features.threejs in <ComfyUI user dir>/was-node-suite/config.yaml (on by default in current releases) and restart.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| object | THREE_OBJECT | The loaded model to animate, from Three Load Model. | |
| clip | STRING | Which clip to play, by name as in `Walk`, or by number as in `0`. Empty plays the first one. A name the model does not carry is an error naming every clip it does. | |
| units | COMBO | per timeline | 'per timeline' fits `speed` passes of the clip across Three App's loop_seconds, so the frame rate only samples it. 'per second' runs the clip at the speed it was authored at instead. 'per capture' fits the passes across the frames actually taken. |
| speed | FLOAT | 1.00-100–100 | On 'per second', the playback rate: 1.0 is the authored speed, 0.5 half of it. On the two spread units, how many passes fill the span: 1.0 is one, 2.0 is two. Negative runs it backwards. |
| offset | FLOAT | 0.00-3600–3600 | Seconds into the clip the run begins at. 0.0 starts at the beginning; give copies 0.0, 0.4 and 0.8 so a crowd does not march in step. |
| loop | COMBO | repeat | `repeat` runs the clip again from the start, `once` holds the last pose, `ping pong` runs it backwards and forwards. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| animated | THREE_OBJECT | The model with its clip running, for Three Group or Three Scene. |