Particle System
?
⚙
−
Preset
Custom
Light Spray
Dense Fluid
Gas Cloud
Heavy Rain
Lava Pool
Explosion Demo
Gravity
Collisions
Overlay
Count
Size
Color
Force Strength
Force Radius
Reset
Shuffle Velocity
Pause
Auto Capacity
Advanced ▶
Grid Visualizer
Grid Off
Time Scale
Collision Quality
Low (1)
Med (2)
High (3)
Very High (5)
Ultra (10)
Grid Size Mode
Auto
Manual
Cell Size (px)
Auto Scale Factor
1× (Tight)
1.1×
1.2×
1.35×
1.5× (Loose)
Blob Density
Off
On
Blob Min Count
Blob Extra Radius
Elasticity
Velocity Coloring
Enable
Zoom / Stats
−
Enable
Follow Mouse
Region Size
Zoom Factor
Particles: 0
Density: 0
Avg Speed: 0
Avg Color:
Types / Selection
−
New From Sel
Assign Sel
Rename
Delete
Active Type Properties
Name
Color
Elasticity
Gravity Scale
Blob Eligible
Apply
Revert
Enable Lasso
Selection Color
Clear
Create Type
Selected: 0
Drag to draw lasso. Double‑click to finalize & recolor using current Selection Color. Or use Apply.
Custom Behavior
On
⤢
−
Script
Run Once
Clear
/* Each frame your code runs with an api object (post-physics by default). Functions you can create: // Called before physics (optional) api.hooks.before = (api) => { // pre-step logic }; // Called after physics (default user main) still executed (your main body below) // Called for each targeted particle after your main code api.hooks.perParticle = (p, api) => { // per particle adjustments }; Examples: api.each(p => { p.vx *= 0.99; }); api.filter(p=>p.y > api.global.height*0.8).forEach(p=> p.vy -= 400*api.dt); if(api.count) api.random().color = '#'+(Math.random()*0xffffff|0).toString(16).padStart(6,'0'); // Override Particle.update (advanced – careful!) // const origUpdate = Particle.prototype.update; // Particle.prototype.update = function(dt){ origUpdate.call(this, dt); this.vx += Math.sin(performance.now()/400)*0.4; }; api.log('particles this frame', api.count); */ api.log('Custom behavior active, particles:', api.count);
Ready.
Apply
Minify