Jitter Effect
Handheld camera shake that doesn't look like a seizure
- images
- IMAGE
Every AI-video project hits the same wall: the output is smooth, clean, and too steady - like it was shot on a tripod that didn't exist. JitterEffect adds realistic camera shake to a batch of frames, with the one control that separates "handheld" from "epileptic fit": frame_coherence. It's the difference between a filmic wobble and a strobe, and this node gets it right by smoothing the random offsets between frames instead of rolling fresh dice every frame.
The inputs that matter
- x_amplitude / y_amplitude (0–50, defaults 3) - maximum horizontal/vertical shift in pixels. Realistic handheld lives at 2–5px; 10+ starts reading as glitch or earthquake.
- rotation_angle (0–5, default 0) - max rotation in degrees. This is the secret to selling handheld: a real camera rotates slightly as it shakes, and 0.1–0.5° of rotation plus a couple px of translation reads far more "organic" than pure translation ever does. Keep it small.
- frame_coherence (0–1, default 0.5) - the smoothing dial. At 0, every frame gets an independent random offset (strobe-like, jarring); at 1, offsets transition almost smoothly (butter-smooth, barely reads as shake). 0.6–0.8 is the realistic band.
- border_mode -
REPLICATE(extends edge pixels, default, best for most shots),REFLECT(mirrors), orCONSTANT(black bars). If you're shaking a shot you care about, REPLICATE hides the movement best; CONSTANT shows the black edges, which is a look in itself. - seed - makes the shake reproducible. Same seed, same wobble. Handy when you're iterating on everything else and don't want the shake changing under you.
Input images, output IMAGE - batch in, batch out, processed with warpAffine per frame.
How it works
Each frame gets a translation + rotation offset; the offsets are then smoothed across frames by the coherence value so the camera doesn't teleport. Because it's per-frame affine warps, it's cheap, deterministic per seed, and keeps your batch dimensions intact - it slots anywhere in a video pipeline.
The honest take
The trap with every jitter node is turning the amplitude up to see it, and then it's ruined - real camera shake is something you barely notice frame to frame and only register in aggregate. So start small: 2–4px, 0.2° rotation, coherence 0.7. It's also a quiet MVP for "glitch" if you drop coherence to ~0.1 and push amplitude, which is a fun two-minute experiment even if it's not why you installed it. For the classic job - making AI-generated footage stop feeling weightless - pair it with FilmGateWeave or grain from the same pack and you've got a motion layer that finally feels shot rather than rendered.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| x_amplitude | INT | 30–50 | — |
| y_amplitude | INT | 30–50 | — |
| rotation_angle | FLOAT | 0.00–5 | — |
| frame_coherence | FLOAT | 0.500–1 | — |
| border_mode | COMBO | REPLICATE | 3 options: CONSTANT, REPLICATE, REFLECT |
| seed | INT | 00–2147483647 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |