Daily Creative Coding

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

回転しながら上昇するオブジェクト

/**
* tornado
*
* @author aa_debdeb
* @date 2016/05/13
*/

ArrayList<Block> blocks;

void setup(){
  size(500, 500, P3D);
  blocks = new ArrayList<Block>();
  rectMode(CENTER);
  noStroke();
}

void draw(){
  lights();
  background(220);
  translate(width / 2, 3 * height / 4, -300);
  rotateX(PI / 3);
  rotateZ(frameCount * 0.003);
  fill(199, 159, 185);
  noStroke();
  rect(0, 0, width, height);
  fill(199, 21, 133);
  stroke(128);
  ArrayList<Block> nextBlocks = new ArrayList<Block>();
  for(Block block: blocks){
    block.display();
    block.update();
    if(!block.isDisappeared()){
      nextBlocks.add(block);
    }
  }
  blocks = nextBlocks;
  if(random(1) < 0.2){
    blocks.add(new Block());
  }
}

class Block{
  
  float value;
  float radian;
  
  
  Block(){
    value = 0.0;
    radian = random(TWO_PI);
  }
  
  void update(){
    value += 0.005;
    radian += PI / 32;
  }
  
  void display(){
    float h = map(value, 0, 1, 0, 450);
    float size = map(value, 0, 1, 30, 0);
    float radious = map(pow(value, 1.0 / 3), 0, 1, 300, 0);
    pushMatrix();
    translate(radious * cos(radian), radious * sin(radian), h);
    box(size);
    popMatrix();  
  } 
  
  boolean isDisappeared(){
    return value > 1.0;
  }
  
}