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,P3D); background(150); noStroke(); randomTracers(); Vec3D target = new Vec3D(0,0,0); attractor = new Attractor(target,100f,1f); randomRepulsors(); light = randomLight(); } void draw(){ translate(400,400,0); rotateY(frameCount*0.001f); for(int i=0;i MAX_STEER) steer = steer.mul(MAX_STEER / steer.size); tracers[t].update(steer); pushMatrix(); translate(tracers[t].pos.x,tracers[t].pos.y,tracers[t].pos.z); rotateY(-frameCount*0.001f); fill(255,120); ellipse(light.x,light.y,5,5); fill(0,120); ellipse(0,0,5,5); popMatrix(); 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),random(-1f,1f)); 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