After Effects Wiggle
The wiggle expression, minus the expressions
- image
- mask
- reference_frame
- IMAGE
- MASK
WiggleEffect is the After Effects "wiggle" expression - that one-liner every motion designer has typed a thousand times - rebuilt as a ComfyUI node. Feed it a frame batch and it applies organic, noise-driven position, scale, and rotation animation to every frame, returning an IMAGE plus a MASK. If you've ever wanted a still or a sequence to gently float, breathe, or rock like it was shot by a slightly shaky hand, this is your node.
The mechanism is the interesting part. It doesn't use keyframes; it samples layered procedural noise. The base motion is a low-frequency drift (default position_frequency 0.2) with a magnitude in pixels (default 15), and on top of that sit detail layers controlled by noise_octaves (default 6), noise_persistence (0.6) and noise_lacunarity (1.5) - the same fractal-noise vocabulary you know from terrain generation. noise_type lets you switch between Perlin (smooth, organic - the default), simplex, value, and cellular noise for different movement personalities. A seed makes the whole pattern reproducible: same seed, same wiggle, every time.
What you'll actually touch
image(IMAGE) - your frames. It processesBframes and returnsBframes; it does not generate new frames from a still. Feed it a sequence at thefpsyou plan to render.fps(default 25),speed,time_offset- the timing layer.time_offsetis your loop-sync tool: shift it to find seamless loop points or stagger multiple wiggle nodes.enable_position/enable_scale/enable_rotation- the three independent motion channels, and each one has its own frequency, magnitude, and phase controls (position_frequency,scale_magnitude,rotation_phase, and so on). Position supportsindependent(leaf-in-wind) orlinked(orbital) modes; scale has linked/independent/none; rotation rocks back and forth or spins.motion_blur(default 0.3) - velocity-based blur that scales with movement. At 0 everything's crisp and stop-motion-y; crank it and fast moves smear like real footage.motion_tile(disabled/mirror/repeat) withmotion_tile_auto_margin- what happens at the frame edges when content moves. Mirror is the default and hides the seams well.preserve_size(default on) - keep the input resolution; turn it off to useframe_width/frame_heightinstead.- Optional
mask(MASK) - white areas get the full wiggle, black stays rock-solid. That's how you hold a face still while the background floats.
Outputs are IMAGE and MASK; the mask is useful if you want to composite the animated result over something else with the movement confined.
Install & expectations
Standard pack install - Manager search "videoclipgenerator", or git clone https://github.com/lazniak/videoclipgenerator into custom_nodes + pip install -r requirements.txt, restart. Uses psutil for memory-batching, so the heavy pack requirements apply.
The README claims quaternion internals, GPU CUDA kernels, and multi-threaded motion blur. Reality: it's torch/PIL per-frame math with a thread pool. The results are genuinely good for subtle-to-mid organic motion, and seed determinism plus time_offset make it workflow-friendly - but it's not a physics engine. The most common beginner stumble is feeding it a single still and expecting a clip: feed it a sequence, because each input frame becomes one animated output frame. And yes, buy_me_a_coffee opens a browser tab. You know the drill by now.
Inputs (39)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| preserve_size | BOOLEAN | true | When enabled, output will maintain the same size as input image. When disabled, custom width and height settings will be used. Keeping original size (enabled) is recommended for best quality and performance |
| frame_width | INT | 12808–8192 | The width of the output frames in pixels. Higher values mean larger image width but require more processing power. Common values: 1280 (HD), 1920 (Full HD), 3840 (4K) |
| frame_height | INT | 7208–8192 | The height of the output frames in pixels. Higher values mean larger image height but require more processing power. Common values: 720 (HD), 1080 (Full HD), 2160 (4K) |
| fps | FLOAT | 25.00.25–1000 | Frames Per Second - determines how many frames are generated per second of animation. Common values: 24 (film), 25 (PAL), 30 (NTSC), 60 (smooth motion). Higher FPS means smoother animation but more frames to process |
| speed | FLOAT | 1.00.1–10 | Controls how fast the wiggle animation plays. Think of it like a speed multiplier: 1.0 is normal speed, 2.0 makes everything move twice as fast, 0.5 makes everything move at half speed. This affects all aspects of motion - position, rotation, and scaling. Useful for fine-tuning the feel of your animation without changing other parameters |
| time_offset | FLOAT | 0.00–3600 | Shifts the starting point of the animation in time (measured in seconds). This is like choosing where in the wiggle pattern you want to begin. Useful for: 1) Creating seamless loops by finding the right offset, 2) Synchronizing multiple wiggle effects by offsetting their start times, 3) Finding the perfect part of the motion pattern for your animation |
| enable_position | BOOLEAN | true | Turns position animation on or off. When enabled, the image will move around its center point based on the position settings below. When disabled, the image stays centered with only scale and rotation effects (if enabled) |
| position_mode | COMBO | independent | Controls how the horizontal (X) and vertical (Y) movements relate to each other. In 'independent' mode, X and Y move separately, creating more random-looking motion (like a leaf in the wind). In 'linked' mode, X and Y are connected to create circular or elliptical paths (like a planet's orbit). Independent is great for organic motion, while linked is better for mechanical or planned movements |
| position_frequency | FLOAT | 0.200–100 | How rapidly the position changes occur. Think of it like adjusting the 'nervousness' of the movement. Low values (0.1-0.5) create slow, smooth drifting motions perfect for subtle effects like floating or swaying. Higher values (1.0+) create rapid, jittery movements good for bouncing or vibrating effects. The magic usually happens between 0.1 and 1.0 for natural-looking motion |
| position_magnitude | FLOAT | 15.00–1000 | Controls how far the image moves from its center point, measured in pixels. Think of it as the 'intensity' of movement. At 15 pixels, you get subtle movement good for gentle floating effects. At 50-100 pixels, you get more dramatic swaying or bouncing. Higher values create wild, sweeping motions. The actual movement will be up to this amount in any direction. Remember: this interacts with motion blur - bigger movements create more blur! |
| position_temporal_phase | FLOAT | 0.00–360 | Shifts the timing of position changes, measured in degrees (0-360). This is like choosing which point in the wiggle cycle to start from. Very useful when you have multiple elements - giving each a different phase (like 0, 120, and 240) creates a pleasing cascade effect. Also great for fine-tuning when exactly movement peaks occur in your animation. Think of it as the 'timing offset' of the movement pattern |
| position_spatial_phase | FLOAT | 90.00–360 | Controls the spatial pattern of movement, measured in degrees (0-360). While temporal phase shifts timing, spatial phase shifts the actual movement pattern. A 90-degree difference between X and Y creates circular motions (when linked). Different values create different elliptical or figure-eight patterns. Great for creating complex, natural-looking movements or precise mechanical patterns |
| enable_scale | BOOLEAN | true | Turns scaling animation on or off. When enabled, the image will grow and shrink based on the scale settings below. This can create breathing, pulsing, or throbbing effects. Can be combined with position and rotation for more complex animations. When disabled, the image maintains its original size while other effects continue to work |
| scale_mode | COMBO | linked | Determines how horizontal and vertical scaling relate to each other. 'Linked' mode scales both dimensions together, preserving aspect ratio - great for pulsing or breathing effects. 'Independent' mode allows separate X/Y scaling for squash-and-stretch effects. 'None' is the same as disabling scale completely. Use 'linked' for natural growth/shrink, 'independent' for more dynamic or cartoony effects |
| scale_frequency | FLOAT | 0.150–100 | How rapidly scaling changes occur. Lower values (0.1-0.3) create slow, breathing-like effects. Higher values create rapid pulsing or vibrating. Very high values might look jittery unless combined with motion blur. The default 0.15 is good for subtle, organic scaling. Consider your animation's mood - slow for calm, faster for energy or tension |
| scale_magnitude | FLOAT | 2.00–100 | The maximum amount of scaling, in percentage points. A value of 2.0 means the image will scale between 98% and 102% of its original size. Small values (1-5) create subtle breathing effects. Larger values (10-20) create more dramatic pulsing. Very large values can create explosive growth and shrinking. Remember: this is a percentage, so 100 means scaling from 0% to 200% - use with caution! |
| scale_temporal_phase | FLOAT | 45.00–360 | Controls when scaling changes occur in the animation cycle (0-360 degrees). Like position_temporal_phase, but for scaling. Use different values for position and scale phase to create complex animations where movement and scaling aren't synchronized. For example, setting this 90 degrees apart from position creates a flow where maximum size occurs a quarter-cycle after maximum movement |
| scale_spatial_phase | FLOAT | 0.00–360 | Affects the relationship between horizontal and vertical scaling patterns when in 'independent' mode. Different values create different patterns of stretching and squashing. 90 degrees creates alternating stretch/squash. 180 degrees makes them oppose each other. Experiment with this when creating squash-and-stretch effects for character animation or bouncing effects |
| enable_rotation | BOOLEAN | true | Turns rotational animation on or off. When enabled, the image will rock back and forth or spin based on rotation settings below. Rotation happens around the image center. Combine with position and scale for effects like floating debris, drifting leaves, or wobbling characters. When disabled, the image maintains its original orientation |
| rotation_frequency | FLOAT | 0.100–100 | Controls how rapidly rotation changes occur. Low values (0.1-0.5) create gentle rocking or swaying. Higher values create faster spinning or shaking. The default 0.1 is good for subtle movement like paper floating or leaves swaying. Higher values (1.0+) work better for mechanical movement or intense effects. Consider using motion blur with faster rotations to smooth the movement |
| rotation_magnitude | FLOAT | 2.00–360 | The maximum rotation angle in degrees. At 2.0, the image rocks ±2 degrees - subtle but noticeable. Values around 5-15 degrees create obvious swaying. 30-90 degrees create dramatic rocking or partial spins. 360 allows complete rotation. Small values (1-5) work well for organic movement, larger values for more dramatic effects. Remember that faster rotation at larger angles needs more motion blur to look smooth |
| rotation_temporal_phase | FLOAT | 30.00–360 | Sets when rotation peaks occur in the animation cycle (0-360 degrees). Like other temporal phases, this helps coordinate rotation with other movements. Try setting this 120 degrees apart from position and scale for complex, organic movement where each aspect peaks at different times. Great for creating flowing, natural-looking animation or controlling precise mechanical timing |
| rotation_spatial_phase | FLOAT | 60.00–360 | Influences the rotational movement pattern. While less intuitive than other spatial phases, this can create interesting variations in how rotation combines with other movements. Different values create different relationships between rotation and position/scale changes. Experiment with this when fine-tuning complex animations |
| time_remap_curve | COMBO | smooth | Controls how movement transitions happen. 'Linear' moves at constant speed - mechanical but predictable. 'Ease' starts slow, speeds up in the middle, then slows down - good for natural movement. 'Ease-in' starts slow and speeds up - like falling. 'Ease-out' starts fast and slows down - like throwing upward. 'Smooth' is extra gentle with strongest smoothing - best for flowing, peaceful movements. Each option drastically changes the feel of your animation |
| motion_blur | FLOAT | 0.300–1 | Adds motion blur based on movement speed and direction - just like a camera capturing fast motion. At 0, movements are crisp but can look choppy. Values around 0.3-0.5 give natural-looking blur. Higher values create more dramatic streaking effects. The blur automatically adapts to movement speed - faster movement creates stronger blur. Great for smoothing fast movements or creating artistic streaking effects |
| motion_tile | COMBO | mirror | Controls what happens at the edges of your frame during movement. 'Disabled' shows empty space/transparency when movement reveals edges. 'Mirror' creates reflected copies at edges - great for seamless motion, prevents empty gaps. 'Repeat' tiles the image at edges like a pattern. 'Mirror' is usually best for natural footage, while 'repeat' can work well for patterns or textures. Important when your movement range is large enough to show edges |
| motion_tile_auto_margin | BOOLEAN | true | When enabled, automatically calculates how much extra space is needed around edges based on your movement settings. This ensures no empty spaces appear during motion. When disabled, you can manually set the margin size. Auto mode is usually best unless you need precise control over edge handling. The auto calculation considers position, scale, and rotation ranges to determine optimal margins |
| motion_tile_margin | FLOAT | 500–200 | Sets the size of edge margins in pixels when auto margin is disabled. This is how much extra space to add around your image for movement. Larger values prevent edge gaps but use more memory. As a rule of thumb, should be at least as large as your maximum movement range (position_magnitude). Too small margins may show edges, too large wastes processing power. Only used when motion_tile_auto_margin is false |
| noise_type | COMBO | perlin | Selects the algorithm that generates the wiggle pattern. 'Perlin' is smooth and natural, great for organic movement like leaves or floating. 'Simplex' is similar but more efficient, good for complex animations. 'Value' creates sharper, more defined changes - good for mechanical or glitch effects. 'Cellular' produces organic, tissue-like patterns great for biological or abstract effects. Perlin is the safest choice for most animations, experiment with others for unique effects |
| noise_octaves | INT | 61–8 | Controls how many layers of detail are in the wiggle pattern. Each octave adds a finer layer of movement. 1 octave = simple, smooth movement. 4-6 octaves = natural, complex movement with several scales of detail. 8 octaves = very detailed movement but slower to calculate. More octaves create more natural, fractal-like motion but require more processing power. Think of it like adding harmonics to a musical note |
| noise_persistence | FLOAT | 0.600–1 | Determines how much each finer detail layer contributes to the movement. Low values (0.2-0.4) create movement dominated by broad, sweeping motions with subtle detail. Higher values (0.6-0.8) make finer details more noticeable, creating more nervous or jittery motion. At 1.0, all detail layers have equal strength. This is like adjusting the mix between broad and fine movement patterns |
| noise_lacunarity | FLOAT | 1.501–4 | Controls how much finer each detail layer becomes. At 1.0, each layer has similar scale. Higher values (2.0+) make each layer much finer than the last, creating more distinction between broad and fine movements. Lower values keep the detail scales more similar. Typically, values between 1.5 and 2.0 give the most natural results. Think of it as adjusting the contrast between different scales of movement |
| interpolation | COMBO | bicubic | Determines how pixels are calculated when the image transforms. 'Bicubic' gives the smoothest, highest quality results but is slowest. 'Bilinear' is a good balance of quality and speed. 'Nearest' gives sharp, pixelated edges - usually only used for pixel art or special effects. For most footage, stick with bicubic. Use bilinear if you need more speed, or nearest for deliberately pixelated looks |
| seed | INT | 00–4294967295 | Sets the random seed for generating the wiggle pattern. The same seed always creates the same movement pattern (when other settings are unchanged). This lets you precisely recreate animations or synchronize multiple elements. Change the seed to get completely different movement patterns while keeping all other settings the same. Useful for trying different movements or creating variety among multiple animated elements |
| buy_me_a_coffee | BOOLEAN | false | A little checkbox that means a lot! Enable this to support the development of this node and future improvements. Every coffee helps fuel new features and optimizations. Think of it as buying the developer a coffee to say thanks! ☕ |
| usage_counter | STRING | Usage count: 0 | Tracks how many times this node has been used across all your projects |
| maskopt | MASK | Optional mask to control where the wiggle effect appears. White areas in the mask get full effect, black areas stay still, gray areas get partial effect. Perfect for making only parts of your image wiggle while keeping other parts stable. Great for combining with animated masks for complex effects | |
| reference_frameopt | IMAGE | Optional reference frame for advanced motion calculations. This is a placeholder for future features that will enable more complex motion analysis and matching. Currently not actively used but included for future compatibility |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |