Zero-GC steering behaviors for autonomous agents. Boids, seek, flee, wander, path following, curl noise.
→ Live Recipes Gallery Demo → Live Recipes Gallery Demo vol.2
10,000 boids at 60fps. 6 scratchpad vectors. Zero garbage collection.
| Feature | lite-steer | Yuka | p5.js steer | Custom code |
|---|---|---|---|---|
| Zero-GC (scratchpad) | Yes | No | No | Manual |
| Float32Array (lite-vec) | Yes | No | No | Rare |
| Deterministic wander | Yes (seeded RNG) | No | No | No |
| Path following | Yes (with lookahead) | Yes | No | Manual |
| Curl noise | Yes | No | No | Manual |
| rotateAround orbit | Yes (1-liner) | No | No | 5+ lines |
| Bundle size | < 3KB | ~40KB | ~800KB (full) | 0 |
npm install @zakkster/lite-steerimport { vec2 } from '@zakkster/lite-vec';
import { seek, bounce } from '@zakkster/lite-steer';
const pos = vec2.create(100, 100);
const vel = vec2.create(0, 0);
const force = vec2.create();
const target = vec2.create(400, 300);
function update() {
seek(force, pos, vel, target, 200, 0.1);
vec2.add(vel, vel, force);
vec2.add(pos, pos, vel);
bounce(pos, vel, 800, 600);
}wanderAngle = wander(force, vel, 20, 0.4, wanderAngle, rng);
avoidEdges(force2, pos, 40, width, height, 0.5);
vec2.add(force, force, force2);
vec2.add(vel, vel, force);
vec2.scale(vel, vel, 0.95); // air friction
vec2.add(pos, pos, vel);separation(fSep, pos, neighbors, 30);
alignment(fAli, vel, neighbors);
cohesion(fCoh, pos, neighbors);
vec2.scale(fSep, fSep, 1.5); // avoid crowding strongly
vec2.scale(fAli, fAli, 1.0);
vec2.scale(fCoh, fCoh, 1.2); // stay with the group
vec2.add(force, fSep, fAli);
vec2.add(force, force, fCoh);
vec2.add(vel, vel, force);
vec2.clampMag(vel, vel, 0, MAX_SPEED);
vec2.add(pos, pos, vel);swirlToward(force, pos, center, 40, 120);
vec2.add(vel, vel, force);
vec2.scale(vel, vel, 0.98); // drag for smooth spiraling
vec2.add(pos, pos, vel);curl(force, pos[0], pos[1], noiseFn);
vec2.scale(force, force, 40);
vec2.add(vel, vel, force);
vec2.scale(vel, vel, 0.92); // heavy drag = thick smoke
vec2.add(pos, pos, vel);followPath(force, pos, vel, path, 120, 30);
vec2.add(vel, vel, force);
vec2.clampMag(vel, vel, 0, 150);
vec2.add(pos, pos, vel);wanderAngle = wander(force, vel, 10, 0.6, wanderAngle, rng);
vec2.add(vel, vel, force);
vec2.scale(vel, vel, 0.90);
vec2.add(pos, pos, vel);
orbit(pos, pos, center, 0.4, dt); // gentle orbit around flowerconst mouse = vec2.create(mouseX, mouseY);
flee(force, pos, vel, mouse, 200, 150);
vec2.add(vel, vel, force);
vec2.scale(vel, vel, 0.96);
vec2.add(pos, pos, vel);Individual: seek, arrive, flee, wander, followFlow
Boids: separation, alignment, cohesion
Boundaries: wrap, bounce, avoidEdges
Orbital: orbit, swirlToward
Noise: curl
Path: projectToSegment, followPath
MIT