Nodes/Comfyui CoTracker Node/PerlinNoise Coordinate Randomizer
ComfyUI Node

PerlinNoise Coordinate Randomizer

Organic jitter for motion tracks that look stitched

By s9roll7·Created about a year ago·Updated about a year ago· 29
PerlinNoise Coordinate Randomizer
  • images_for_marker
  • noise_mask
  • randomized_results
  • image_with_results
tracking_results
spatial_scale1000
time_scale60
intensity100
octaves3
seed0
enabledtrue

CoTracker gives you motion that's faithful to the reference. This node gives you motion that's alive. If your track-driven video looks too mechanical - points sliding around like they're glued to rails - PerlinCoordinateRandomizerNode layers smooth, organic noise on top of your tracking data, so nearby points drift together the way cloth or hair actually does instead of twitching independently.

Perlin noise is the same trick games use for terrain and clouds: gradient noise that's continuous in space and time. This pack implements it in plain Python - permutation table, fades, interpolation, the classic algorithm - and samples a 3D version at each point, each frame. Because nearby points sample nearby noise, they move coherently; because time is one of the noise axes, movement is smooth frame-to-frame rather than random flicker. The README frames it as adding "natural, smooth variations to tracking points," and that's exactly the use case: take a CoTracker output, add flutter, get motion that reads as physics.

It's the pack's most tunable node, and the sliders all do what the tooltips say. spatial_scale (in pixels) sets how far apart two points have to be before they stop moving in sync - larger means smooth and coherent, smaller means chaotic and erratic. time_scale (in frames) sets how slowly the noise evolves - larger means slow drift, smaller means fast jitter. intensity is the displacement in pixels, so start small. octaves layers in detail - 3 is a good default, and cranking toward 10 gets you busy, nervous motion fast. seed makes it reproducible, noise_mask restricts the randomization to a masked region (how you keep a face still while hair moves), and enabled lets you bypass the node without rewiring the graph.

Input tracking_results takes the STRING from CoTrackerNode, GridPointGeneratorNode, or even the XY amplifier. Outputs mirror the parent node: randomized_results (STRING, same format, straight into ATI Tracks) and image_with_results (the clip with red markers) if you pass images_for_marker, so you can eyeball the displacement before committing to a render.

One honest caution: the default intensity of 100 pixels is a lot. On a 480p clip that's a big chunk of the frame, and it will happily drag points onto the wrong object if you're not watching. The demo videos in the pack look great because they were tuned. Start around 10–20 and work up.

Install is the shared pack story: ComfyUI Manager → "Comfyui CoTracker Node", or clone the repo and restart. No model, no weights - the Perlin generator is pure numpy, so it runs anywhere, offline, instantly. It's the node you reach for when tracking alone feels stiff.

Categorytracking/utility

Inputs (9)

NameTypeDefaultDescription
tracking_resultsSTRING
images_for_markeroptIMAGE
noise_maskoptMASKMask for randomize
spatial_scaleoptINT10001–9999spatial_scale (pixels) / Larger → Smooth, coherent movement (nearby points move similarly) / Smaller → Chaotic, erratic movement (neighboring points move randomly)
time_scaleoptINT601–1000time_scale (frames) / Larger → Slow movement / Smaller → Fast movement
intensityoptINT1001–1000intensity (pixels) / Larger → Big displacement / Smaller → Small displacement
octavesoptINT31–10octaves (layers) / Larger → Complex, detailed movement / Smaller → Simple, basic movement
seedoptINT00–4294967295
enabledoptBOOLEANtrue

Outputs (2)

NameTypeDescription
randomized_resultsSTRING
image_with_resultsIMAGE