見出し画像

Generative Art #168

Code

ArrayList<Form>form = new ArrayList<Form>();
float a = 0;

void setup() {
 size(800, 800, OPENGL);
 pixelDensity(2);
 rectMode(CENTER);
 newForm();
}

void draw() {
 background(0);
 camera(width*0.5, height*1.1, width*0.6, width*0.5, height*0.65, 0, 0, 1, 0);

 push();
 translate(width/2, height/2);
 rotateZ(a);
 translate(-width/2, -height/2);
 for (Form f : form) {
   f.run();
 }
 pop();
 a+= 0.002;

 saveFrame("output/####.png");
 if(frameCount > (60*50)){
   exit();
 }
}

void newForm() {
 form = new ArrayList<Form>();
 int c = 10;
 float w = width/c;

 noFill();
 stroke(0);

 for (int j=0; j<c; j++) {
   for (int i=0; i<c; i++) {
     form.add(new Form(i*w+w/2, j*w+w/2, w));
   }
 }
}

void mousePressed() {
 newForm();
}

void keyPressed() {
 if (key == 's')saveFrame("####.png");
}

int[] colors = {#eac435, #345995, #03cea4, #fb4d3d, #ca1551};
int getCol() {
 return colors[(int)random(colors.length)];
}

class Form {
 float x, y, s;
 float ss;
 float hs;
 float z=0;
 float angle=0;
 int t, t1, t2, t3, t4, t5;
 int start, end;
 float step;
 color col;
 Form(float x, float y, float s) {
   this.x = x;
   this.y = y;
   this.s = s;

   hs = s/2;
   step = 1;
   start = 2000;
   t = -(int)random(start);
   t1 = 40;
   t2 = t1+20;
   t3 = t2+60;
   t4 = t3+20;
   t5 = t4+60;
   end = t5+(start+t);
 }

 void show() {
   noFill();
   stroke(#FFEDED);
   strokeWeight(0.7);
   push();
   translate(x, y);
   if (t < t1)square(0, 0, ss);
   else {
     for (int i=0; i<4; i++) {
       rotate(HALF_PI);
       push();
       translate(s/2, 0);
       rotateY(angle);
       beginShape();
       vertex(0, ss/2, 0);
       vertex(0, ss/2, z);
       vertex(0, -ss/2, z);
       vertex(0, -ss/2, 0);
       endShape(CLOSE);
       pop();
     }
   }
   pop();
 }

 void move() {
   if (t > 0) {
     if (t < t1)ss = map(t, 0, t1-1, 0, s);
     else if (t < t2);
     else if (t < t3)z = map(t, t2, t3-1, 0, s);
     else if (t < t4);
     else if (t < t5)angle = map(t, t4, t5-1, 0, HALF_PI);
     else if (t > end && ss > 0 && z > 0) {
       ss-=0.5;
       z-=0.5;
     }
   }
   t += step;
 }

 void run() {
   show();
   move();
 }
}

boxがにょきにょき生えてきてぱかっと開きます。

ちゃんと最後のショワァァァ・・・となくなるところまで見てください!

動きを制御するの大変そうだし、動画に書き出すのもめんどくさい、PC熱くなるしと思ってアニメーション避けてたんですけど、シンプルにたのしいです。

次から動きに面白さを追加したいからイージングも使っていこうと思ってます。

Happy coding!!!

応援してくださる方!いつでもサポート受け付けてます!