Nodes/WAS Node Suite v3/Three Animate Transform
ComfyUI Node Runs on cloud

Three Animate Transform

Make your Three.js object spin, bob and breathe — no JavaScript required

By WASasquatch·Created 3 years ago·Updated 4 days ago· 1,844
Three Animate Transform
  • object
  • animated
unitsper timeline
rotate_x0
rotate_y30
rotate_z0
bob_amplitude0.00
bob_frequency1.00
pulse_amplitude0.00
pulse_frequency1.00
phase0.00

This is the node that stops a Three.js scene being a still. You build a box, drop in an area light, get a nice orbit going in the viewer - and now it just sits there. Wire the object through Three Animate Transform and it spins like a turntable, or bobs like it's floating, or breathes in and out. It's the difference between a product shot and a product render, and it's where the "video" part of a 3D workflow starts.

The motion is worth understanding before you touch a widget. The node wraps the object rather than editing it - the tooltip on object says exactly that - so the thing you wired in is left alone and a moving copy comes out the other side. That means one mesh can feed two animate nodes doing different things, and you can chain animators without corrupting your base scene. What actually happens: a small animation clock lives with the object, and the browser-side renderer advances it every frame. Your Python graph never moves a vertex; it just describes the motion.

The three knobs that matter:

  • rotate_x / rotate_y / rotate_z - degrees of turn. rotate_y defaults to 30, a slow turntable; negative runs it backwards.
  • units - the trap everyone hits first. It's set to per timeline by default, which spreads your amounts across Three App's loop_seconds. So rotate_y: 180 is half a turn per loop, whatever your frame rate. Switch to per second and the same 180 becomes a half-turn every second - the frame rate starts mattering. per capture spreads the amount across the frames actually taken, which is the mode where "180 degrees over 180 frames" needs no arithmetic at all.
  • phase - a time offset into the cycle. Give two copies of the same object phases of 0.0 and 0.5 and they stop moving in lockstep, which is how a field of bobbing orbs doesn't look like a marching band.

Then there's bob_amplitude/bob_frequency (slide up and down - 0.25 at 1.0 is a gentle float) and pulse_amplitude/pulse_frequency (breathe the scale - 0.1 swells it a tenth). Leave everything at 0.0 and the object stays perfectly still; that's a legitimate use too, a no-op animator you can switch on later.

Wire the animated output into Three Group or straight onto Three Scene's root socket, exactly where the still object would have gone. To turn the motion into pixels you capture it with Three Render (it's what samples the timeline into frames) or just watch it live in Three Viewer.

Installing it

This ships in WAS Node Suite v3 - install the pack and the whole Three menu comes with it. In ComfyUI Manager search WAS Node Suite v3, or clone manually:

cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git

Then restart ComfyUI. You need ComfyUI 0.14.0+ and Python 3.10+, and nothing else - v3 installs no pip packages and downloads nothing. The Three nodes sit behind a features.threejs gate in <ComfyUI user dir>/was-node-suite/config.yaml; if the menu is missing, make sure that key is true and restart. One genuine gotcha: a capture only happens when a ComfyUI browser tab is open, so don't queue a Three Render run headlessly and walk away.

If it looks wrong

Rotations are degrees, not radians, so 360 is one full turn. If something spins crazily fast, you're on per second with per timeline numbers. And remember the motion is added to whatever pose the object already has - transform it first, animate second.

CategoryWAS Suite/Three

Inputs (10)

NameTypeDefaultDescription
objectTHREE_OBJECTThe object to animate. It is wrapped rather than changed.
unitsCOMBOper timeline'per timeline' spreads the amounts across Three App's loop_seconds, so `180` is 180 degrees per loop and the frame rate only samples it. 'per second' reads them as rates instead, so `90` is a quarter turn a second. 'per capture' spreads them across the frames actually taken, so the same `180` runs end to end whatever the frame count.
rotate_xFLOAT0-36000–36000Degrees per second around X. 0.0 is still, 90.0 is a quarter turn a second.
rotate_yFLOAT30-36000–36000Degrees per second around Y. 30.0 is a slow turntable, negative reverses it.
rotate_zFLOAT0-36000–36000Degrees per second around Z. 0.0 is still, 90.0 is a quarter turn a second.
bob_amplitudeFLOAT0.000–100000How far it rises and falls, in scene units. 0.0 is off, 0.25 is a gentle float.
bob_frequencyFLOAT1.000–1000Bobs per second. 1.0 is one rise and fall a second, 0.25 is languid.
pulse_amplitudeFLOAT0.000–1000How much the scale breathes, as a fraction. 0.0 is off, 0.1 swells it a tenth.
pulse_frequencyFLOAT1.000–1000Pulses per second. 1.0 is one breath a second, 2.0 is twice as quick.
phaseFLOAT0.00-100000–100000Offset into the cycle, in seconds. Give copies 0.0, 0.5 and 1.0 so they do not move in step.

Outputs (1)

NameTypeDescription
animatedTHREE_OBJECTThe moving object, for Three Group or the root socket on Three Scene.