Nodes/RyanOnTheInside/Particle Emitter βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
ComfyUI Node

Particle Emitter βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜

Define where and how particles spawn

By ryanontheinsideΒ·Created 2 years agoΒ·Updated 5 months agoΒ· 852
Particle Emitter βš‘πŸ…‘πŸ…žπŸ…£πŸ…˜
  • previous_emitter
  • emitter_movement
  • spring_joint_setting
  • particle_modulation
  • emitter_modulation
  • PARTICLE_EMITTER
β—„emitter_x0.50β–Ί
β—„emitter_y0.50β–Ί
β—„particle_direction0β–Ί
β—„particle_spread30β–Ί
β—„particle_size17.4β–Ί
β—„particle_speed330β–Ί
β—„emission_rate10.0β–Ί
β—„color(255,255,255)β–Ί
β—„initial_plume0.00β–Ί
β—„start_frame0β–Ί
β—„end_frame0β–Ί
β—„emission_radius0.0β–Ί

This is the base building block of the pack's particle system - the node that defines a source: where particles come from, what direction they shoot, how fast, how big, what color. On its own it does nothing visible; it produces a PARTICLE_EMITTER definition that has to be handed to ParticleEmissionMask (the node that actually simulates and renders) before you see a single particle.

How it works

emitter_x/emitter_y (0–1, normalized) place the source on the canvas. particle_direction (degrees) and particle_spread (a cone width around that direction, in degrees) control the general aim - a tight particle_spread gives a focused jet, a wide one gives an even spray in all directions if you push it near 360. particle_size, particle_speed, emission_rate, and color set the basic look and pace of what comes out. initial_plume gives an extra burst of particles right at the start, on top of the steady emission rate - handy for a sudden puff rather than a slow build. emission_radius spreads the spawn point out over an area instead of a single pixel, and start_frame/end_frame bound when this particular emitter is active within the simulation.

The real depth is in the five optional inputs, all of which chain this emitter into the rest of the pack's particle ecosystem: previous_emitter stacks multiple emitters into one combined PARTICLE_EMITTER set (the standard chaining pattern used throughout this pack's force fields and emitters alike). emitter_movement takes an EMITTER_MOVEMENT from the pack's EmitterMovement node, making the emission point itself wander instead of sitting fixed. emitter_modulation takes an EMITTER_MODULATION from EmitterEmissionRateModulation, letting the emission rate itself change over time or react to a FEATURE. particle_modulation takes a PARTICLE_MODULATION from any of ParticleColorModulation, ParticleSizeModulation, or ParticleSpeedModulation, applying a per-particle attribute change over the particles' lifetime. spring_joint_setting hooks into the pack's spring-joint physics elsewhere in the particle system, for particles connected by springs rather than moving freely.

The inputs and outputs that matter

  • emitter_x/emitter_y (0–1) - spawn position.
  • particle_direction/particle_spread (degrees) - aim and cone width.
  • particle_size, particle_speed, emission_rate, color - basic look and pace.
  • previous_emitter, emitter_movement, emitter_modulation, particle_modulation, spring_joint_setting (all optional) - the chaining points into the rest of the particle system.

Output is a single PARTICLE_EMITTER - wires into ParticleEmissionMask's emitters input, where it's actually simulated.

How to install it

ComfyUI Manager: search "RyanOnTheInside", install, restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt

then restart. The particle system runs on pymunk, tightly pinned (>=6.8.0,<7.0.0) in requirements.txt - a version conflict there is a real, known way for this whole side of the pack to fail on install.

Common issues & troubleshooting

Nothing appears even though this node runs without error. Expected - an emitter alone has no downstream simulation. Confirm it's wired into ParticleEmissionMask's emitters input before assuming a problem.

Emitted particles ignore a gravity well or vortex you set up. Those are wired into ParticleEmissionMask separately (via vortices/wells), not into this node - an emitter defines a source, not the forces acting on what it spawns.

Only one of several chained emitters seems active. Check previous_emitter is actually threaded through every node in the chain - if one emitter in the middle isn't connected to the next, the chain breaks there and only whichever segment reaches ParticleEmissionMask gets simulated.

CategoryRyanOnTheInside/ParticleSystems/Modulators

Inputs (17)

NameTypeDefaultDescription
emitter_xFLOAT0.500–1X-coordinate of the emitter (0.0 to 1.0)
emitter_yFLOAT0.500–1Y-coordinate of the emitter (0.0 to 1.0)
particle_directionFLOAT00–360Direction of particle emission in degrees (0.0 to 360.0)
particle_spreadFLOAT300–360Spread angle of particle emission in degrees (0.0 to 360.0)
particle_sizeFLOAT17.41–400Size of emitted particles (1.0 to 400.0)
particle_speedFLOAT3301–1000Speed of emitted particles (1.0 to 1000.0)
emission_rateFLOAT10.00–100Rate of particle emission (0.1 to 100.0)
colorSTRING(255,255,255)Color of emitted particles (RGB string)
initial_plumeFLOAT0.000–1Initial burst of particles (0.0 to 1.0)
start_frameINT00–10000Frame to start the emission (0 to 10000)
end_frameINT00–10000Frame to end the emission (0 to 10000)
emission_radiusFLOAT0.00–100Radius of the area from which particles are emitted (0.0 to 100.0)
previous_emitteroptPARTICLE_EMITTEROptional previous emitter to chain with (PARTICLE_EMITTER type)
emitter_movementoptEMITTER_MOVEMENTOptional movement configuration (EMITTER_MOVEMENT type)
spring_joint_settingoptSPRING_JOINT_SETTINGOptional spring joint configuration (SPRING_JOINT_SETTING type)
particle_modulationoptPARTICLE_MODULATIONOptional particle modulation configuration (PARTICLE_MODULATION type)
emitter_modulationoptEMITTER_MODULATIONOptional emitter modulation configuration (EMITTER_MODULATION type)

Outputs (1)

NameTypeDescription
PARTICLE_EMITTERPARTICLE_EMITTERβ€”