class Ball extends PhysicsObject{ //------------------------------------------------ Ball(float iradius, float ix, float iy, float iz){ x = ix; y = iy; z = iz; radius = iradius; friction = 0.95; } //------------------------------------------------ void simulate(){ PhysicsObject obj = objects; while(obj!=null){ if(obj!=this) obj.ballInteraction(this); obj = obj.next; } if(next!=null) next.simulate(); } //------------------------------------------------ void ballInteraction(PhysicsObject obj){ float d = dist(x,y,z,obj.x,obj.y,obj.z); if( d < radius+obj.radius ){ fx += 0.05*(radius+obj.radius-d)*(x-obj.x)/d; fy += 0.05*(radius+obj.radius-d)*(y-obj.y)/d; fz += 0.05*(radius+obj.radius-d)*(z-obj.z)/d; vx *= obj.friction; vy *= obj.friction; vz *= obj.friction; } } //------------------------------------------------ void surfaceInteraction(PhysicsObject obj){ if(y>obj.y-radius) fy += -(y+radius-obj.y)*0.1; } //------------------------------------------------ void gravityInteraction(PhysicsObject obj){ fy += ((Gravity)obj).force; } //------------------------------------------------ void frictionInteraction(PhysicsObject obj){ vx *= obj.friction; vy *= obj.friction; vz *= obj.friction; } //------------------------------------------------ void update(){ vx += fx; vy += fy; vz += fz; fx = 0f; fy = 0f; fz = 0f; x += vx; y += vy; z += vz; if(next!=null) next.update(); } //------------------------------------------------ void visualize(){ translate(x,y,z); fill(255); //stroke(128); noStroke(); sphere(radius-2); translate(-x,-y,-z); if(next!=null) next.visualize(); } }