Image → particles
image_to_particlesTransform any image into a GPU particle field that dissolves into points on audio cues and springs back to the original image. Each particle carries its pixel's color and rest position.
Instructions
Turn any image (a file path or an existing TOP) into a GPU particle field: each particle's rest position is its pixel in the source and (by default) its colour is sampled from that pixel. A spring force pulls particles toward their rest pixel; an optional audio chain scatters them away and lets them spring back, producing the iconic 'image dissolves into points on the drop, then re-forms' VJ look. Builds a new baseCOMP holding a downsampled source TOP, a one-shot rest-position GLSL TOP, velocity + position feedback loops (RGBA32float), an instanced Geometry COMP, Render, and a Null output. This is the only particle tool seeded by image/video pixels (rest positions + per-pixel colour); pick a sibling instead when particles are NOT driven by an image: create_gpu_particle_field for a free noise/curl/gravity drift field, create_particle_flock for boids/flocking, create_pop_particle_system for TouchDesigner's native POP particle network, create_particle_system for a simple CPU emitter. Default source is TD's stock Banana.tif; default audio source is 'none' (image idles statically) — 'file' and 'device' are opt-in (the latter may pop the macOS mic-permission dialog). Returns a summary plus a JSON block with the container path, particle count, output path, exposed controls, node errors, warnings, and an inline preview image.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| damp | No | Per-frame velocity damping. | |
| side | No | Particle grid edge; count = side². 192 → 36 864 particles. The source TOP is resampled to side×side so each texel maps 1:1 to one particle. | |
| source | No | Image source: { kind:'file', path } loads a moviefileinTOP, { kind:'top', path } references an existing TOP. Default uses TD's stock Banana.tif from app.samplesFolder. | |
| audio_file | No | Audio file path when audio_source='file'. | |
| color_mode | No | 'image' = particle colours sampled from source pixels (via instancecolorop). 'mono' = white points. 'tint' = single colour multiplied by luminance. | image |
| tint_color | No | RGB used when color_mode='tint'. | |
| parent_path | No | Parent network where the container is created. | /project1 |
| audio_source | No | Drives the scatter impulse. 'none' = image idles statically. 'file' = audiofileinCHOP (set audio_file). 'device' = audiodeviceinCHOP (opt-in; may pop the macOS mic-permission dialog). | none |
| particle_size | No | Radius of each instanced dot (TOP instancing applies translate only, so size lives on the source sphere SOP). | |
| expose_controls | No | When true, expose live PointSize / SpringStiff / ScatterStr / Damp / Zoom knobs. | |
| scatter_strength | No | Audio impulse magnitude. 0 = particles sit perfectly on the image. | |
| spring_stiffness | No | Force pulling each particle toward its rest pixel. Higher snaps back faster. |