Y0/FMCC/W3 – Flowers

I tried using p5’s image library and WEBGL to create expressive scenes in 3D.

The first thing I did was to load my images into an array.

Made using Aseprite

I imported a few transparent images I found of flowers from Google into Aseprite and converted them to indexed colour using the EDG32 palette by ENDESGA. This makes the flowers look like a cohesive set.

let flowers = [];

function preload(){
  flowers[0] = loadImage('./flowers/green1.png');
  flowers[1] = loadImage('./flowers/orange1.png');
  flowers[2] = loadImage('./flowers/pink1.png');
  flowers[3] = loadImage('./flowers/purple1.png');
  flowers[4] = loadImage('./flowers/red1.png');
  flowers[5] = loadImage('./flowers/red2.png');
  flowers[6] = loadImage('./flowers/red3.png');
  flowers[7] = loadImage('./flowers/white1.png');
  flowers[8] = loadImage('./flowers/white2.png');
  flowers[9] = loadImage('./flowers/yellow1.png');
}

Then I set the canvas to use WEBGL.

createCanvas(800, 800, WEBGL);

I use nested loops to draw a bunch of concentric spinning rings of flowers. I disabled the depth mask so I didn’t have to deal with draw order.

function draw() {
  
  background('#e43b44');
  
  const gl = this._renderer.GL;
  gl.depthMask(false);
  
  orbitControl();
  
  let ringCount = 64;
  for(var r = ringCount; r > 0; r--){
    let pulse = (r*0.1*frameCount);
    for(var i = 0; i < flowers.length; i++){
      push();
      translate((50*r)*cos(i*36+pulse), (60*r), (50*r)*sin(i*36+pulse));
      rotateY((i*-36-pulse)+90);
      rotateX(45);
      texture(flowers[i]);
      plane(flowers[i].width*(0.2*r),flowers[i].height*(0.2*r));
      pop();
    }
  }
}

Final

Made using p5.js

https://editor.p5js.org/woojinJang_/full/Ob8MY9Koi

let flowers = [];
const notzero = 0.000000001; //wanted 0 but 0 makes the maths go wrong.

function preload(){
  flowers[0] = loadImage('./flowers/green1.png');
  flowers[1] = loadImage('./flowers/orange1.png');
  flowers[2] = loadImage('./flowers/pink1.png');
  flowers[3] = loadImage('./flowers/purple1.png');
  flowers[4] = loadImage('./flowers/red1.png');
  flowers[5] = loadImage('./flowers/red2.png');
  flowers[6] = loadImage('./flowers/red3.png');
  flowers[7] = loadImage('./flowers/white1.png');
  flowers[8] = loadImage('./flowers/white2.png');
  flowers[9] = loadImage('./flowers/yellow1.png');
}

function setup() {
  createCanvas(800, 800, WEBGL);
  
  cam = createCamera();
  
  imageMode(CENTER);
  angleMode(DEGREES);
  noStroke();

  cam.setPosition(notzero,2400,notzero);
  cam.lookAt(0,0,0);
  
  frameCount = random(5000);
}

function keyPressed(){
  saveCanvas();
}

function draw() {
  
  background('#e43b44');
  
  const gl = this._renderer.GL;
  gl.depthMask(false);
  
  orbitControl();
  
  let ringCount = 64;
  for(var r = ringCount; r > 0; r--){
    let pulse = (r*0.1*frameCount);
    for(var i = 0; i < flowers.length; i++){
      push();
      translate((50*r)*cos(i*36+pulse), (60*r), (50*r)*sin(i*36+pulse));
      rotateY((i*-36-pulse)+90);
      rotateX(45);
      texture(flowers[i]);
      plane(flowers[i].width*(0.2*r),flowers[i].height*(0.2*r));
      pop();
    }
  }
}

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *