Particle3D[] tracers; Attractor attractor; Repulsor[] repulsors; Vec3D light; float MAX_STEER=.01f; float MAX_VEL=1.0f; int NUM_REPULSORS = 40; int NUM_TRACERS = 100; void setup(){ size(800,800); background(150); noStroke(); randomTracers(); Vec3D target = new Vec3D(0,0,0); attractor = new Attractor(target,100f,1f); randomRepulsors(); light = randomLight(); smooth(); } void draw(){ translate(400,400); for (int t=0;t MAX_STEER) steer = steer.mul(MAX_STEER / steer.size); tracers[t].update(steer); fill(255,120); ellipse(tracers[t].pos.x+light.x,tracers[t].pos.y+light.y,3,3); fill(0,120); ellipse(tracers[t].pos.x,tracers[t].pos.y,3,3); if(tracers[t].vel.size<.1f){ tracers[t].age++; } else{ tracers[t].age=0; } if (tracers[t].age>20) tracers[t]=randomTracer(); } } Particle3D randomTracer(){ Vec3D pos = new Vec3D(random(-1f,1f),random(-1f,1f),0); pos = pos.normalize(); pos = pos.mul(random(0.5f,1.5f)*300f); //Vec3D vel = new Vec3D(random(-1f,1f),random(-1f,1f),random(-1f,1f)); Vec3D vel= pos.normalize(); //vel = vel.normalize(); vel = vel.mul(-MAX_VEL); return new Particle3D(pos, vel); } Vec3D randomLight(){ Vec3D pos = new Vec3D(random(-1f,1f),random(-1f,1f),0); pos = pos.normalize(); return pos; } void randomRepulsors(){ repulsors = new Repulsor[NUM_REPULSORS]; for(int i=0;i