Particle Emitter β‘π ‘π π £π
Define where and how particles spawn
- previous_emitter
- emitter_movement
- spring_joint_setting
- particle_modulation
- emitter_modulation
- PARTICLE_EMITTER
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.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| emitter_x | FLOAT | 0.500β1 | X-coordinate of the emitter (0.0 to 1.0) |
| emitter_y | FLOAT | 0.500β1 | Y-coordinate of the emitter (0.0 to 1.0) |
| particle_direction | FLOAT | 00β360 | Direction of particle emission in degrees (0.0 to 360.0) |
| particle_spread | FLOAT | 300β360 | Spread angle of particle emission in degrees (0.0 to 360.0) |
| particle_size | FLOAT | 17.41β400 | Size of emitted particles (1.0 to 400.0) |
| particle_speed | FLOAT | 3301β1000 | Speed of emitted particles (1.0 to 1000.0) |
| emission_rate | FLOAT | 10.00β100 | Rate of particle emission (0.1 to 100.0) |
| color | STRING | (255,255,255) | Color of emitted particles (RGB string) |
| initial_plume | FLOAT | 0.000β1 | Initial burst of particles (0.0 to 1.0) |
| start_frame | INT | 00β10000 | Frame to start the emission (0 to 10000) |
| end_frame | INT | 00β10000 | Frame to end the emission (0 to 10000) |
| emission_radius | FLOAT | 0.00β100 | Radius of the area from which particles are emitted (0.0 to 100.0) |
| previous_emitteropt | PARTICLE_EMITTER | Optional previous emitter to chain with (PARTICLE_EMITTER type) | |
| emitter_movementopt | EMITTER_MOVEMENT | Optional movement configuration (EMITTER_MOVEMENT type) | |
| spring_joint_settingopt | SPRING_JOINT_SETTING | Optional spring joint configuration (SPRING_JOINT_SETTING type) | |
| particle_modulationopt | PARTICLE_MODULATION | Optional particle modulation configuration (PARTICLE_MODULATION type) | |
| emitter_modulationopt | EMITTER_MODULATION | Optional emitter modulation configuration (EMITTER_MODULATION type) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PARTICLE_EMITTER | PARTICLE_EMITTER | β |