Daily Creative Coding

元「30 min. Processing」。毎日、Creative Codingします。

球の周りに小さな球を公転させる

/**
* 3D Orbital System
*
* @author aa_debdeb
* @date 2015/09/25
*/

float ORBITAL_RADIOUS = 100;
int SPHERE_NUM = 50;
float SPHERE_RADIOUS = 5;
float SPHERE_RADIAN_SPEED = PI / 32;

ArrayList<Sphere> spheres;

void setup(){
  size(500, 500, P3D);
  smooth();
  frameRate(24);
  noStroke();
  spheres = new ArrayList<Sphere>();
  for(int i = 0; i < SPHERE_NUM; i++){
    spheres.add(new Sphere());
  }
}

void draw(){
  background(255);
  
  fill(150, 150);
  pushMatrix();
  translate(width/2, height/2, 100);
  sphere(50);
  popMatrix();
  
  for(int i = 0; i < SPHERE_NUM; i++){
    spheres.get(i).draw();
  }
  for(int i = 0; i < SPHERE_NUM; i++){
    spheres.get(i).update();
  }
}

class Sphere{
  float radian1;
  float radian2;
  float radianSpeed1;
  float radianSpeed2;
  
  Sphere(){
    radian1 = random(PI * 2);
    radian2 = random(PI * 2);
    radianSpeed1 = random(1) < 0.5 ? SPHERE_RADIAN_SPEED : -1.0 * SPHERE_RADIAN_SPEED;
    radianSpeed2 = random(1) < 0.5 ? SPHERE_RADIAN_SPEED : -1.0 * SPHERE_RADIAN_SPEED;
  }
  
  void draw(){
    fill(255, 0, 0);
    pushMatrix();
    translate(width/2, height/2, 100);
    translate(ORBITAL_RADIOUS * sin(radian1) * cos(radian2), ORBITAL_RADIOUS * sin(radian1) * sin(radian2), ORBITAL_RADIOUS * cos(radian1));
    sphere(SPHERE_RADIOUS);
    popMatrix();
    
  }
  
  void update(){
    radian1 += radianSpeed1;
    radian2 += radianSpeed2;
    if(radian1 < 0){
      radian1 += PI * 2;
    } else if(radian1 >= PI * 2){
      radian1 -= PI * 2;
    }
    if(radian2 < 0){
      radian2 += PI * 2;
    } else if(radian2 >= PI * 2){
      radian2 -= PI * 2;
    }
  }  
  
}