Looking Outwards – 02

The series of pieces I’m writing about is Mitchell Whitelaw’s ‘Limits to Growth’, a series of visual patterns made with a generative AI demonstrating a growth’s ability to limit itself through creating patterns that create a final piece that visually looks ‘whole’. While I know very little on how the artwork was made, I can hypothesize that a draw function creates a mass of lines that curve in certain patterns, with a constraint that if a line is too close to intercepting another line, the line will stop expanding. I enjoy how artistically, it doesn’t have to be known that AI generated this artwork, it could be a print that simply looks visually appealing, and mysteriously calculated.

https://mtchl.net/limits-to-growth/

Looking Outwards – 01

The piece of artwork I’ll be evaluating is an audio-reative visualizer called “Red and Blue” from Max MSP Youtuber, AmazingMaxStuff. It’s a device you can import into an audio project, in my case music, and edit parameters to make visuals that react to the audio project. I’m not sure how long it took to create, though looking into the projects code, it must have taken at least a few days of work (after years of learning Max MSP). Prior works the creator could be inspired by include visuals for sound waves, as the the project itself is very representative of how many audio devices depict sound in motion. ‘Red and Blue’ opens a lot of possibilities for Max MSP audio-reative visualizers, as it’s a complex, but easily understandable device that allows for plenty of customization for music artists to create visuals to all their audio’s work. The device itself requires a purchase, but here is a link to the Youtube video showcasing the device.

Project 3 – Dynamic Drawing

For this dynamic drawing, drag your mouse across the screen. The more left you drag the mouse, the color diagrams will expand inwards. Dragging your mouse downwards will expand the circles vertically, creating an overlap of both colors and alpha values. This will mean when you drag your mouse to the bottom right corner, there will be a large pink-white shape taking up most of the screen.

csavitzv_03
//Cole Savitz-Vogel
//csavitzv
//Section A


    function setup() {
     createCanvas(600, 600);
     pixelDensity(2);
     rectMode(RADIUS);
     var morph = (dist(mouseX, mouseX, width / 2, 0))
     var span = (dist(mouseY, mouseY, height / 2, 0))
}

    function draw() {
     background(0);
     strokeWeight(3);
     stroke(255, 255, 255, 25);
     strokeJoin(ROUND);
     noSmooth();
     if (mouseIsPressed){
     push();
     blendMode(ADD);
     fill(150, 20, 110, 50);
     ellipse(300 + (morph, span, 100, 300), 75, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 100, 300), 100, (5 * mouseX), mouseY);
     fill(150, 20, 30, 50);
     ellipse(300 + (morph, span, 150, 300), 125, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 150, 300), 150, (5 * mouseX), mouseY);
     fill(100, 50, 10, 50);
     ellipse(300 + (morph, span, 200, 300), 175, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 200, 300), 200, (5 * mouseX), mouseY);
     fill(100, 100, 0, 50);
     ellipse(300 + (morph, span, 250, 300), 225, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 250, 300), 250, (5 * mouseX), mouseY);
     fill(50, 150, 50, 50);
     ellipse(300 + (morph, span, 300, 300), 275, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 300, 300), 300, (5 * mouseX), mouseY);
     fill(20, 100, 150, 50);
     ellipse(300 + (morph, span, 250, 300), 325, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 250, 300), 350, (5 * mouseX), mouseY);
     fill(70, 50, 150, 50);
     ellipse(300 + (morph, span, 200, 300), 375, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 200, 300), 400, (5 * mouseX), mouseY);
     fill(110, 20, 150, 50);
     ellipse(300 + (morph, span, 150, 300), 425, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 150, 300), 450, (5 * mouseX), mouseY);
     fill(150, 20, 110, 50);
     ellipse(300 + (morph, span, 100, 300), 475, (5 * mouseX), mouseY);
     ellipse(300 - (morph, span, 100, 300), 500, (5 * mouseX), mouseY);
     pop();
  }
}

Project 2 – Portrait Variables

For my project, I chose to make very cartoonish but expression filled “blumans”. These little characters are portraits that change face shape, expression, and proportions based on the code below.

csavitzv_02
    //Cole Savitz-Vogel
    //Section A

    //Variability includes, Face Hight and Width, Eye Size, Eye Seperation, Eyebrow Position, Pupil Proportions, Mouth Size, Mouth Position, Smile Ratio, Skin Tone 

var eyeSize = 20;
var faceWidth = 100;
var faceHeight = 100;
var eyeWidth = .25
var mouthSize = 50;
var mouthDrop = 0;
var smile = 5;
var inBrow = 0;
var outBrow = 0;
var skinR = 200;
var skinG = 200;
var skinB = 250;

 
function setup() {
    createCanvas(640, 480);
}
 

function draw() {
    background(255);
    fill(skinR,skinG,skinB)
    strokeWeight(0);
    ellipse(width / 2, height / 2, faceWidth,  faceHeight);
    fill(0);
    var mouth = width / 2 + faceWidth;
    arc(width / 2, (height / 2)+mouthDrop, mouthSize, mouthSize, 0, PI, OPEN);
    fill(skinR,skinG,skinB)
    arc(width / 2, (height / 2) + mouthDrop - 1, mouthSize - 1, mouthSize - smile, 0, PI, OPEN);
    var eyeLX = width / 2 - faceWidth * eyeWidth;
    var eyeRX = width / 2 + faceWidth * eyeWidth;
    fill(250);
    ellipse(eyeLX, height / 2, eyeSize + 4);
    ellipse(eyeRX, height / 2, eyeSize + 4);
    fill(0);
    ellipse(eyeLX, height / 2, eyeSize - 2);
    ellipse(eyeRX, height / 2, eyeSize - 2);
    strokeWeight(10);
    line(eyeLX - inBrow, (height / 2) - 20, eyeLX + 20,(height / 2)- outBrow);
    line(eyeRX + inBrow, (height / 2) - 20, eyeRX - 20,(height / 2)- outBrow);
}
 
function mousePressed() {
    faceWidth = random(100, 150);
    faceHeight = random(100, 160);
    eyeSize = random(10, 30);
    eyeWidth = random(.2,.6);
    mouthSize = random(30,70);
    mouthDrop = random(0,40);
    smile = random(.1,50);
    inBrow = random(10,25);
    outBrow = random(10,25);
    skinR = random(100, 200);
    skinG = random(100, 200);
    skinB = random(200, 250);
    
}

Project 1 – Portrait Project

For this project, I used different shapes to make a self-portrait.

csavitzv – 1
 function setup() {
}
 function setup() {
  createCanvas(300, 300);
   background(253);
}
//Background
  function draw() {
    background(206, 193, 232);
    strokeWeight(0)
    fill(153, 134, 191,150);
    circle(50,150,200);
    fill(182, 139, 214,150);
    circle(150,190,200);
    fill(163, 116, 158,100);
    circle(220,90,200);
    fill(224, 112, 212,90);
    circle(60,20,200);
    fill(224, 112, 212,90);
    circle(300,220,200);
    fill(153, 134, 191,50);
    circle(100,250,200);
    
//Face Outline
    fill(242, 196, 177);
    stroke(103,74,43);
    strokeWeight(4);
    beginShape();
    vertex(95, 95);
    vertex(77, 140);
    vertex(80, 146); 
    vertex(77, 158);   
    vertex(95, 246);
    vertex(120, 270); 
    vertex(155, 265);
    vertex(185, 225);  
    vertex(197, 168);
    vertex(195, 148); 
    vertex(175, 92); 
    endShape(CLOSE);

//Nose
    stroke(103,74,43);
    strokeWeight(4);  
    line(130, 160, 115, 155);
    line(123, 200, 130, 160);
    line(123, 200, 131, 202);
    
//Mouth
    bezier(150, 232, 145, 235, 125, 225, 108, 234);

//Eye Sockets
    stroke(255,255,255);
    fill(255,255,255);
    arc(107, 170, 20, 13, 0, PI + QUARTER_PI, CHORD);
    fill(255,255,255);
    arc(151, 164, 24, 25, 0, HALF_PI + QUARTER_PI, CHORD);
 
//Iris
    stroke(185,143,61);
    fill(185,143,61);
    arc(110, 169, 8, 8, 0, PI + QUARTER_PI, CHORD);
    stroke(185,143,61);
    fill(185,143,61);
    arc(151, 166, 9, 13, 0, HALF_PI + QUARTER_PI, CHORD);

//Eyebrows
    noFill();
    stroke(90,48,11);
    strokeWeight(8);
    curve(140, 126, 180, 136, 145, 155, 193, 121);
    stroke(90,48,11);
    curve(110, 136, 115, 156, 80, 140, 120, 150);
    
//Hair
    strokeWeight(5);
    fill(105, 88, 44);
    stroke(79, 54, 36);
    quad(195,176,185,155,162,123,190,128)
    beginShape();
    vertex(182,106);
    vertex(190,108);
    vertex(192,110);
    vertex(193,112);
    vertex(196,118);
    vertex(197,123);
    vertex(198,130);
    vertex(199,135);
    vertex(200,136);
    vertex(201,138);
    vertex(202,140);
    vertex(201,140);
    vertex(199,139);
    vertex(190,138);
    endShape();
    triangle(164,101,178,119,180,75)
    beginShape();
    vertex(150, 113);
    vertex(159, 114);
    vertex(170, 108);
    vertex(165, 98);
    vertex(163, 94);
    vertex(160, 90);
    vertex(150, 85);
    vertex(145, 80);
    vertex(135, 76);
    vertex(125, 74);
    vertex(115, 70);
    vertex(110, 65);
    vertex(111, 70);
    vertex(115, 76);
    vertex(120, 84);
    endShape();
    beginShape();
    vertex(74, 78);
    quadraticVertex(180, 90, 160, 110);  
    quadraticVertex(180, 110, 160, 130);
    endShape();
    line(75,79,90,90)
    beginShape();
    vertex(100, 90);
    quadraticVertex(180, 100, 120, 130);
    quadraticVertex(20, 180, 80, 180);
    vertex(80, 180);
    vertex(100, 90);
    quadraticVertex(10, 100, 50, 130);
    quadraticVertex(20, 180, 80, 180);
    vertex(80, 180);
    endShape();
    arc(188, 115, 45, 20, 20, PI + QUARTER_PI);
    arc(165, 115, 45, 10, 160, 300, HALF_PI + QUARTER_PI);
    stroke(105, 88, 44);
    strokeWeight(7);
    line(99,95,88,141)
    
    
    
}

Project 03

This project shows somebody ducking their head instinctively upon hearing the firing of a spitball. As the mouse is moved from left to right, the spitball fires, and the head goes from facing the viewer to facing and shifting downward. The facial features also move with the mouse’s movement to achieve the illusion of perspective. The hair size increases and the eyes and mouth widen and disappear. The background changes color to provide a sense of impact and display a transition of the person’s emotion from unaware to alarmed, dark to bright.

sketch
// Jerry Xu (jwx)
// Section A
// Project 3: Spitball

let rSky = 153
let gSky = 153
let bSky = 0

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(rSky, gSky, bSky);
  fromSky = color(0, 0, 0);
  toSky = color(252, 242, 197);
  backgroundColor = lerpColor(fromSky, toSky, mouseX/width);
  background(backgroundColor);


  //meteor color constraints
  rMeteor = constrain(123, 169, 220);
  gMeteor = constrain(123, 169, 220);
  bMeteor = constrain(123, 169, 220);
  
  //trail color constraints
  
  rTrail = 255
  gTrail = 255
  bTrail = random(51, 204);

  
  var mConX = constrain(mouseX, 25, 500);
  var mConY = constrain(mouseY, 100, 100);

//projectile
  strokeWeight(0.1);
  fill(rTrail,bTrail,gTrail);
  fromTrail = color(255, 255, 51);
  toTrail = color(255, 255, 204);
  fillTrail = lerpColor(fromTrail, toTrail, mouseX/width);
  fill(fillTrail);
  triangle(mConX-60,mConY-25, mConX-10,mConY-5, mConX-10, mConY-26);
  triangle(mConX-130,mConY-10, mConX-10,mConY-5, mConX-10, mConY-26);
  triangle(mConX-60,mConY+25, mConX+10,mConY+5, mConX+10, mConY+26);
  triangle(mConX-130,mConY+10, mConX+10,mConY+5, mConX+10, mConY+26);
  triangle(mConX-150,mConY, mConX-5,mConY+20, mConX-10, mConY-20);
  stroke(255);
  fill(rMeteor,bMeteor,gMeteor);
  fromMeteor = color(253, 197, 94);
  toMeteor = color(255, 240, 173);
  fillMeteor = lerpColor(fromMeteor, toMeteor, mouseX/width);
  fill(fillMeteor);
  ellipse(mConX,mConY,55,55);
  ellipse(mConX,mConY,45,45);

//straw  
  stroke(0);
  strokeWeight(0.5);
  fill(0, 112, 74);
  circle(65, 99.5, 57.52);
  noStroke();
  rect(0, 71, 70, 57);
  stroke(0);
  strokeWeight(0.5);
  line(0, 71, 72.5, 71);
  line(0, 128, 72.5, 128);
  
//constrain ducking height
var hConX = constrain(mouseX, 180, 300);

//head, neck, body
  fill(fillMeteor);
  quad(250, 300, 180, 330, 500, 330, 400, 300);
  quad(160, 500, 180, 330, 500, 330, 400, 500);
  stroke(255, 216, 194);
  strokeWeight(80);
  line(7/8 * width, 3/4 * height, 7/8 * width, hConX);
  fill(12);
        fill(255, 216, 194);
        stroke(0);
        strokeWeight(0.2);
        circle(7/8 * width, hConX+51, 200);
  
//hair size change to create perspective when head goes down
  fill(0);
  if (mouseX > 200){
    ellipse(7/8*width, hConX+30, 180, 170);
    translate(300,400); 
  } else 
      ellipse(7/8*width, hConX, 180, 100);

//facial features
  if (mouseX > 150 & mouseX < 200){
    fill(255);
    ellipse(7/8*width+40, hConX+100, 40, 20);
    ellipse(7/8*width-30, hConX+100, 40, 20);
    fill(0);
    circle(7/8*width + 40, hConX+100, 20);
    circle(7/8*width - 30, hConX+100, 20);
    fill(255,0,0);
    ellipse(7/8*width+5, hConX+130, 20, 30);
  } else if (mouseX < 150){
    fill(255);
    ellipse(7/8*width+40, hConX+100, 30, 10);
    ellipse(7/8*width-30, hConX+100, 30, 10);
    fill(0);
    circle(7/8*width + 40, hConX+100, 10);
    circle(7/8*width - 30, hConX+100, 10);
    line(340, 300, 370, 300);
  }
}

Computational Fabrication

One of the projects that I admire that involves computational fabrication is 3D printed prosthetics. Specifically, there is a project where veterinarians from ZooTampa and the director of 3D clinical applications at USF came up with the idea of 3D printing a prosthetic for a bird who had to get its beak removed. The prosthetic ended up saving the bird’s life.  First, they used CT scans to make sure that the prosthetic fit properly, then the scans were used to develop and print a guide. This helped the doctors perform the surgery and make sure that when the original beak was removed, the prosthetic would be able to accurately take its place. The team used something called BioMed White resin (which is relatively new material), to make the beak. This method can not only be used for animals, but eventually for humans and other species. With this type of technology and ability, we would be able to save countless lives of both animals and humans.

https://www.3dnatives.com/en/3d-printed-prosthetic-beak-saves-birds-life-200420224/#!

Picture of the bird saved by prosthetic.

SydneyCha-LookingOutwards-03

A close up of Aguahoja III from the side.

Aguahoja III is an organic 3D creation made with cellulose bound with other natural materials (lignin, pectin, etc.) to form a strong sculpture that has both aesthetic and structural properties. It is part of a creation line by the MIT Media Lab and is specifically the third iteration of their Aguahoja series.

This project and the process through which it was created feels both organic and mechanical.

Inside Aguahoja III-the outer “shell” parts at the center to reveal the inside.


Aguahoja III uses a flexible generative design method that assigns a bipolymer skin to any input geometry and calculates the required parameters to actually print and create the sculpture. To put it simply, the algorithm generates the design and process simultaneously, making the physical rendering of the sculpture much more efficient.

A breakdown of Aguahoja III’s generated features.


Though made with an algorithm, the Media Lab creators’ decision to use biodegradable materials and their aesthetic choices are clearly present in this project. The piece in its own existence sends a message of responsible and environmentally conscious art,

Project 03

This is my project 03

sketch

function setup() {
    createCanvas(600, 450);
    background(220);
    text("p5.js vers 0.9.0 test.", 10, 15);
}
//cloud left variables
var x1 = 70
var y1 = 60;
var cwidth = 60;
var cheight = 40;
//cloud right variables
var x2 = 400;
var y2 = 60;
//star left variables
var sx1 = 70;
var sy1 = 130;
var sw1 = 3;
var sh1 = 12;
//star right variables
var sx2 = 400;
var sy2 = 130;
var sw2 = 12
var sh2 = 21
//color for cloud
var rc = 183;
var gc = 186;
var bc = 202;
var angle = 0
//color for rain
var rr = 57;
var rg = 85;
var rb = 96;
//flower 
var anglef = 0
var diam = 45
var rf = 199
var gf = 101
var bf = 93

function draw() {
    background(255)
    //ground
    noStroke();
    push();
    angle = mouseX*0.15   //background rotation
    mouseX = max(min(mouseX,600),0);
    rotate(radians(angle))
    fill(237,186,185);
    rect(0,400,800,50);
    fill(246,219,219);
    rect(0,350,800,50);
    fill(214,211,203);
    rect(0,300,800,50);
    fill(214,207,141);
    rect(0,250,800,50);
    fill(242,126,113);
    rect(0,200,800,50);
    fill(237,186,185);
    rect(0,150,800,50);
    fill(246,219,219);
    rect(0,100,800,50);
    fill(214,211,203);
    rect(0,50,800,50);
    fill(214,207,141);
    rect(0,0,800,50);
    pop();

    //cloud left
    fill(rc,gc,bc);
    ellipse(x1,y1,cwidth,cheight);
    ellipse(x1+30,y1-10,cwidth,cheight);
    ellipse(x1+60,y1,cwidth,cheight);
    ellipse(x1,y1+20,cwidth,cheight);
    ellipse(x1+30,y1+25,cwidth,cheight);
    ellipse(x1+60,y1+20,cwidth,cheight);
    ellipse(x1+30,y1+10,cwidth,cheight);
    ellipse(x1-20,y1+10,cwidth/1.5,cheight/1.5);
    ellipse(x1+80,y1+10,cwidth/1.5,cheight/1.5);
    cwidth = 60 + mouseX*0.03 // size change due to the mouseX position
    cheight = 40 + mouseX*0.03
    x1 = mouseX  // position change according to the mouseX
    bc = 202- mouseX*0.1 // color change of cloud according to the mouseX

    //cloud right
    fill(rc,gc,bc);
    ellipse(x2,y2,cwidth,cheight);
    ellipse(x2+30,y2,cwidth,cheight);
    ellipse(x2+60,y2,cwidth,cheight);
    ellipse(x2,y1+20,cwidth,cheight);
    ellipse(x2+30,y2+25,cwidth,cheight);
    ellipse(x2+60,y2+20,cwidth,cheight);
    ellipse(x2+30,y2+10,cwidth,cheight);
    ellipse(x2-20,y2+10,cwidth/1.5,cheight/1.5);
    ellipse(x2+80,y2+10,cwidth/1.5,cheight/1.5);
    x2 = 600- mouseX // position change according to the mouseX
    rc = 183- mouseX*0.1+20 // color change of cloud according to the mouseX
    
    
    //rain left
    fill(rr,rg,rb);
    ellipse(sx1,sy1,sw1,sh1);
    ellipse(sx1-25,sy1-12,sw1,sh1);
    ellipse(sx1+20,sy1+10,sw1,sh1);
    ellipse(sx1-15,sy1+20,sw1,sh1);
    ellipse(sx1+40,sy1+40,sw1,sh1);
    ellipse(sx1+10,sy1+40,sw1,sh1);
    ellipse(sx1+10,sy1+40,sw1,sh1);
    ellipse(sx1+50,sy1+10,sw1,sh1);
    ellipse(sx1+75,sy1+20,sw1,sh1);
    ellipse(sx1+70,sy1-13,sw1,sh1);
    ellipse(sx1+35,sy1+80,sw1,sh1);
    ellipse(sx1+45,sy1+120,sw1,sh1);
    ellipse(sx1+20,sy1+110,sw1,sh1);
    ellipse(sx1,sy1+80,sw1,sh1);
    ellipse(sx1+50,sy1+60,sw1,sh1);
    ellipse(sx1-10,sy1+50,sw1,sh1);
    sx1 = mouseX; // position change according to the mouseX
    sw1 = 3+mouseX*0.013 // size change due to the mouseX position
    sh1 = 12+mouseX*0.013
    rg = 85-mouseX*0.2 // color change of rain according to the mouseX
    rr = 57- mouseX*0.1+20 // color change of rain according to the mouseX

    //rain right
    fill(rr,rg,rb);
    ellipse(sx2,sy2,sw2,sh2);
    ellipse(sx2-30,sy2-12,sw2,sh2);
    ellipse(sx2+20,sy2+10,sw2,sh2);
    ellipse(sx2-15,sy2+20,sw2,sh2);
    ellipse(sx2+40,sy2+40,sw2,sh2);
    ellipse(sx2+10,sy2+40,sw2,sh2);
    ellipse(sx2+10,sy2+40,sw2,sh2);
    ellipse(sx2+50,sy2+10,sw2,sh2);
    ellipse(sx2+85,sy2+20,sw2,sh2);
    ellipse(sx2+70,sy2-13,sw2,sh2);
    ellipse(sx2+35,sy2+80,sw2,sh2);
    ellipse(sx2+30,sy2+140,sw2,sh2);
    ellipse(sx2+20,sy2+110,sw2,sh2);
    ellipse(sx2,sy2+80,sw2,sh2);
    ellipse(sx2+50,sy2+60,sw2,sh2);
    ellipse(sx2-10,sy2+50,sw2,sh2);
    sx2 = 600- mouseX // position change according to the mouseX
    sw2 = 12-mouseX*0.013 // size change due to the mouseX position
    sh2 = 21-mouseX*0.013
    rb = 96+mouseX*0.05 // color change of rain according to the mouseX

    //flower center
    if(mouseX>width/2){
        fill(110,109,28);
        rect(width/2-5,height/2+28,10,height/2);
        rect(width/4-5,height/4*3+28,10,height/2);
        rect(width/4*3-5,height/4*3+28,10,height/2);
        push();
        translate(width/2,height/2)
        rotate(radians(anglef)); //flower rotate by it self 
        fill(rf,gf,bf);
        circle(-15,-25,diam)
        circle(15,-25,diam)
        circle(-15,25,diam)
        circle(15,25,diam);
        circle(28,0,diam)
        circle(-28,0,diam)
        fill(231,183,diam);
        circle(0,0,diam);
        pop();
        bf = 93+mouseX*0.05

        diam = 45+mouseX/20
        anglef += 3
        //flower left
        push();
        translate(width/4,height/4*3)
        rotate(radians(anglef)); //flower rotate by it self 
        fill(249,213,216);
        circle(-15,-25,diam/2);
        circle(15,-25,diam/2);
        circle(-15,25,diam/2);
        circle(15,25,diam/2);
        circle(28,0,diam/2);
        circle(-28,0,diam/2);
        fill(189,135,136);
        circle(0,0,diam/2);
        pop();
        //flower right
        push();
        translate(width/4*3,height/4*3)
        rotate(radians(anglef)); //flower rotate by it self 
        fill(195,231,254);
        circle(-15,-25,diam/2);
        circle(15,-25,diam/2);
        circle(-15,25,diam/2);
        circle(15,25,diam/2);
        circle(28,0,diam/2);
        circle(-28,0,diam/2);
        fill(238,218,92);
        circle(0,0,diam/2);
        pop();
        //sun
        fill(245,177,86);
        ellipse(width/2,height/6,diam*1.1);


    }



}

Looking Outward 03

Looking Outwards 03: Computational Fabrication
The most interesting point of this project is applying this kind of parametric designed panel to the building envelope. Also, the parametrically designed façade used for this building is not only for decoration purposes but also for the bad-air-busting. The form of the panel was first designed in CAD programs and created in the software called Rhino. Even though they didn’t mention a lot about the creation process, I suppose that they used grasshopper and BMI system so that the overall shape and form can vary according to the changing parameter. I think the most important characteristic that makes this project wonderful is that the impressive façade can also increase the surface area of the building, and it can bring more natural light into the building, which creates a better place for people inside. Also, having TiO2, which is an air-scrubbing material coated outside the surface, can maximize the effect of air purification when the sunlight gets stronger.


https://www.architectmagazine.com/technology/architectural-detail/fighting-a-megacitys-pollution-with-mega-panels_o