opening_cubes

first attempt with P3D

// made by alex
// iamalexbaker@gmail.com

int n_cubes = 4;
float box_size = 100;
float phase, colour_phase = 0;
float move_dist = 100;
color[] c = new color[n_cubes];
color[] d = new color[n_cubes];
float colour_spread = 110;
void setup()
{
  size(800, 800, P3D);
  rectMode(CENTER);
  fill(51);
  stroke(255);
  noStroke();
  for (int i = 0; i < c.length; i++) 
  {
    float cc = random(255);
    c[i] = color(constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), 255 - (255/c.length+1)*i);
    d[i] = color(constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), 255 - (255/c.length+1)*i);
  }
  //translate(width/2,height/2,0);
}

void draw()
{
  background(230);
  translate(width/2, height/2, 0);
  rotateX(phase*0.01);
  rotateY(phase*0.008);
  rotateZ(phase*-0.007);

  float cl = abs(sin(colour_phase * PI/4));
  if (cl >= 1.0) {
    colour_phase = 0.0;
    cl = 0;
    for (int i = 0; i < c.length; i++)
    {
      float cc = random(255);

      c[i] = d[i];
      d[i] = color(constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), constrain(cc+random(colour_spread)-colour_spread/2, 0, 255), 255 - (255/c.length+1)*i);
    }
  }
  cube(box_size/2, lerpColor(c[0], d[0], cl), -PI/32, move_dist/2);
  cube(box_size, lerpColor(c[1], d[1], cl), PI/32, move_dist);
  cube(box_size*2, lerpColor(c[2], d[2], cl), -PI/32, move_dist*2);
  cube(box_size*3, lerpColor(c[3], d[3], cl), PI/32, move_dist*3);

  phase += 0.1;
  colour_phase += 0.01;
}

void cube(float size, color fc, float phase_rate, float m_d) {
  pushMatrix();
  fill(fc);
  float rot_offset = sin(phase_rate * phase);
  float offset = abs(rot_offset) * m_d;

  rotateY(TWO_PI * rot_offset);
  rotateZ(PI * rot_offset);
  // L/R
  pushMatrix();
  translate(size/2 + offset, 0, 0);
  rotateY(PI/2);
  rect(0, 0, size, size);
  translate(0, 0, -(size+offset*2));
  rect(0, 0, size, size);
  popMatrix();
  // T/B
  pushMatrix();
  translate(0, -size/2 - offset, 0);
  rotateX(PI/2);
  rect(0, 0, size, size);
  translate(0, 0, -(size+offset*2));
  rect(0, 0, size, size);
  popMatrix();
  // B/F
  pushMatrix();
  translate(0, 0, size/2 + offset);
  rotateZ(PI/2);
  rect(0, 0, size, size);
  translate(0, 0, -(size+offset*2));
  rect(0, 0, size, size);
  popMatrix();
  popMatrix();
}

Leave a comment