Emitter Movement β‘π ‘π π £π
Make the particle emitter itself wander, not just what it emits
- feature
- EMITTER_MOVEMENT
EmitterEmissionRateModulation controls how many particles come out; this node controls where they come from. It puts oscillating motion on the emitter's position and firing direction - a sine-like wobble on X and Y, plus a wobble on the angle particles get shot out at - so instead of a static point spraying particles, you get a source that drifts and sways as the simulation runs. Combine the two and you've got both "how much" and "where from" covered on the particle-system side of this pack, which also includes gravity wells, vortices, and spring joints per the author's own demos.
How it works
Six frequency/amplitude pairs (well, five plus one paired field) set up the base motion: emitter_x_frequency/emitter_x_amplitude control how fast and how far the emitter drifts horizontally, emitter_y_frequency/emitter_y_amplitude do the same vertically, and direction_frequency/direction_amplitude oscillate the angle particles are emitted at. Left alone, these run as a fixed, repeating wobble driven purely by their frequency settings - a Lissajous-style path if X and Y frequencies differ. The feature_param field is where this node plugs into the pack's reactive system: pick which one of emitter_x_frequency, emitter_y_frequency, or direction_frequency you want an external FEATURE signal (optional feature input) to drive instead of holding it fixed - so a beat-synced wave or an audio amplitude curve can make the emitter's wobble speed up and slow down with your source signal rather than running on its own clock.
The inputs and outputs that matter
emitter_x_frequency(default 0.1, range 0β10) - "How quickly the emitter moves horizontally."emitter_x_amplitude(default 0.1, range 0β0.5) - "Maximum horizontal distance the emitter moves."emitter_y_frequency(default 0, range 0β10) - "How quickly the emitter moves vertically."emitter_y_amplitude(default 0.5, range 0β0.5) - "Maximum vertical distance the emitter moves."direction_frequency(default 0, range 0β10) - "How quickly the emission angle changes."direction_amplitude(default 180, range 0β360) - "Maximum angle change in degrees."feature_param- which parameter aFEATUREinput is allowed to modulate:emitter_x_frequency,emitter_y_frequency, ordirection_frequency.feature(optional, FEATURE) - "Optional feature to modulate the movement."
Output: a single EMITTER_MOVEMENT, which feeds into the pack's base particle-emitter node alongside (or instead of) an emission-rate modulation, to actually apply the motion in the simulation.
How to install it
Via ComfyUI Manager: search "RyanOnTheInside," install, restart. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside.git
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt
then restart. Runs on pymunk, the physics engine pinned in the pack's requirements - no model download, but a pymunk install failure will take out this whole particle-system side of the pack, so check your startup console log if these nodes are missing.
Common issues & troubleshooting
The emitter doesn't visibly move at all. With emitter_y_frequency and direction_frequency both defaulting to 0, only the horizontal wobble runs out of the box - set a non-zero frequency on whichever axis you actually want motion on.
Wired in a feature but nothing changes. Check feature_param is actually set to the parameter you intend to modulate - since only one of the three frequency fields can be feature-driven at a time, it's easy to wire the signal in and leave the target pointing at the wrong (or a still-zero) parameter.
Motion looks jerky instead of smooth. That's usually the underlying FEATURE signal being noisy rather than this node - a raw, unsmoothed audio amplitude curve driving direction_frequency will produce jerky angle changes. Try a shaped source like BeatWaveFeatureExtractor if you want something more predictable-looking.
Emitter wanders further than expected. emitter_x_amplitude and emitter_y_amplitude cap out at 0.5 - that's a proportion of your simulation space, not pixels, so a value that looks small in the widget can still be a meaningful chunk of your frame depending on how the base emitter node interprets it. Nudge it down if the drift looks excessive.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| emitter_x_frequency | FLOAT | 0.100β10 | How quickly the emitter moves horizontally (0.0 to 10.0) |
| emitter_x_amplitude | FLOAT | 0.100β0.5 | Maximum horizontal distance the emitter moves (0.0 to 0.5) |
| emitter_y_frequency | FLOAT | 0.000β10 | How quickly the emitter moves vertically (0.0 to 10.0) |
| emitter_y_amplitude | FLOAT | 0.500β0.5 | Maximum vertical distance the emitter moves (0.0 to 0.5) |
| direction_frequency | FLOAT | 0.000β10 | How quickly the emission angle changes (0.0 to 10.0) |
| direction_amplitude | FLOAT | 1800β360 | Maximum angle change in degrees (0.0 to 360.0) |
| feature_param | COMBO | Parameter to be modulated by the feature ('emitter_x_frequency', 'emitter_y_frequency', 'direction_frequency') | |
| featureopt | FEATURE | Optional feature to modulate the movement (FEATURE type) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| EMITTER_MOVEMENT | EMITTER_MOVEMENT | β |