Project 03: Dynamic Drawing

  1. Size of large circle changes
  2. Shade of large circle changes
  3. Rotation of smaller circle changes
  4. Stroke of smaller circles changes

var uniX = 0;
var uniY = 0;


function setup() {
    createCanvas(600, 450);
    background(0);
}

function draw() {
    uniX = mouseX;
    uniY = mouseY;
    background(0);
    push();
    fill(255);
    ellipse (uniX,uniY,200);
    pop();
    for (let i = 25; i <= 575; i+=50)
    {
        for (let j = 25; j <= 425; j+=50)
        {
            circleChange(i,j);
        }
    }
}

function circleChange(Cx,Cy) {
    distanceO = Math.sqrt((uniX-Cx)*(uniX-Cx) + (uniY-Cy)*(uniY-Cy));
    distance = constrain(distanceO, 10, 200);
    var diameter = distance/4;
    var angle = Math.atan2((uniY-Cy),(uniX-Cx));
    push();
    strokeWeight(1);
    stroke(0,0,255,255);
    noFill();
    arc(Cx, Cy, diameter, diameter, -0.25*PI, 0.75*PI);
    pop();
    push();
    strokeWeight(1);
    stroke(255,0,0,255);
    arc(Cx, Cy, diameter, diameter, 0.75*PI, 1.75*PI);
    pop();

    push();
    strokeWeight(0);
    fill(distance/200*255);
    ellipse (Cx,Cy,diameter-2);
    pop();

    fill(255);
    strokeWeight(distanceO/60);
    ellipse((Cx+diameter*Math.cos(angle)/3),(Cy+diameter*Math.sin(angle)/3),diameter/3);

}

anabelle’s project 03

This is my project! Try making the sky change from sundown to midnight, see the moon change phases, and the stars glitter! You can try to pet the cat as well <3

sketch
// kayla anabelle lee (kaylalee)
// section c
// project 03 ^^

moonX = 200; 
moonY = 150;
outline = 55;
inline = 50;

let direction = 0.8;
let speed = 1;
let starDiam = 20; 

let redValue = 231;
let greenValue = 157;
let blueValue = 193;

let skyScraperX = 300;
let skyScraperY = 100;

let happyMouthX = 60;
let happyMouthY = 450;

let triangleWindowX = 225;
let triangleWindowY = 185;
let catDirection = 1;
let catAngle = 1;
let moonSpin = 0;

function setup () {
    createCanvas(450, 600);
}

function draw() {
    print(catAngle);
    background(redValue, greenValue, blueValue);

    // constrain the rbg values to the 2 sky colors i want
    redValue = constrain(redValue, 46, 231);
    greenValue = constrain(greenValue, 26, 157);
    blueValue = constrain(blueValue, 71, 193);

    // turns dusk when mouse on left, turns night when mouse on right
    if (mouseX > width/2) { 
        redValue -= 3;
        blueValue -= 3;
        greenValue -= 3;

    } if (mouseX < width/2) {
        redValue += 3;
        blueValue += 3;
        greenValue += 3;
    }

    // moon cycle
    if (mouseX <= 100) {
        newMoon(35, 290, 30, 30);
    } if (100 < mouseX & mouseX <= 200) {
        crescentMoon(115, 110, 30, 30);
    } if (200 < mouseX & mouseX <= 300) {
        gibbousMoon(190, 50, 30, 30);
    } if (300 < mouseX) {
        fullMoon(300, 50, 30, 30);
    }

    // triangular building
    stroke(164, 96, 175);
    strokeWeight(1);
    fill(119, 127, 199);
    fill(230, 209, 242);
    quad(95, 600, 220, 170, 390, 170, 390, 600);

    // triangle building windows
    // im sorry i couldnt use a forLoop for these as well -- whenever i tried, the program wouldnt load

    triangleWindow(triangleWindowX,triangleWindowY);
    triangleWindow(triangleWindowX - 5, triangleWindowY + 20);
    triangleWindow(triangleWindowX - 10, triangleWindowY + 40);
    triangleWindow(triangleWindowX - 15, triangleWindowY + 60);
    triangleWindow(triangleWindowX - 20, triangleWindowY + 80);
    triangleWindow(triangleWindowX - 25, triangleWindowY + 100);
    triangleWindow(triangleWindowX - 30, triangleWindowY + 120);
    triangleWindow(triangleWindowX - 35, triangleWindowY + 140);
    triangleWindow(triangleWindowX - 40, triangleWindowY + 160);
    triangleWindow(triangleWindowX - 45, triangleWindowY + 180);
    triangleWindow(triangleWindowX - 50, triangleWindowY + 200);
    triangleWindow(triangleWindowX - 55, triangleWindowY + 220);
    triangleWindow(triangleWindowX - 60, triangleWindowY + 240);
    triangleWindow(triangleWindowX - 65, triangleWindowY + 260);

    // skyscraper
    fill(217, 196, 236);
    stroke(164, 96, 175);
    strokeWeight(1);

    rect(300, 100, 150, 500);
    rect(350, 45, 100, 55);
    triangle(350, 40, 450, 0, 530, 40);

    // skyscraper windows
    for(skyScraperX = 300; skyScraperX < 440; skyScraperX += 40) {
        for(skyScraperY = 100; skyScraperY < 650; skyScraperY +=40) {
            push(); 
            translate(20, 20);
            skyWindow();
            pop();
        }
    }

    // happymouth building
    stroke(164, 96, 175);
    strokeWeight(1);
    fill(204, 183, 229);
    rect(40, 430, 195, 170);
    rect(50, 380, 170, 40);

    textSize(25);
    fill(244, 244, 211);
    stroke(119, 127, 199);
    text("happyMouth()", 60, 405);

    // happymouth windows
    for(happyMouthX = 40; happyMouthX < 200; happyMouthX += 60) {
        for(happyMouthY = 420; happyMouthY < 600; happyMouthY += 30) {
            push(); 
            translate(15, 30);
            happyWindow();
            pop(); 
        }
    }

    // if mouse on happymouth sign, stars pulse AND crescent moon rotates
    if (dist(135, 390, mouseX, mouseY) < 30) {
        starrySky();
        starDiam += direction * speed;

        if (starDiam > 30) {
            direction = -direction;
            starDiam = 30;

        } if (starDiam < 0) {
            direction = -direction;
            starDiam = 0;  
        } 

    } else starrySky();

    // rooftop building
    fill(177, 156, 216);
    stroke(64, 96, 175);
    quad(185, 550, 270, 420, 430, 420, 410, 550);
    fill(190, 169, 223);
    rect(185, 550, 225, 50);
    quad(410, 600, 410, 550, 430, 420, 430, 600);

    // cat perch and cat
    fill(117, 80, 166);
    rect(0, 180, 150, 60);

    cat(130, 120, 10, 10)
    triangle(43, 69, 39, 78, 45, 78);
    triangle(74, 82, 64, 84, 72, 93);

    push();
    rotate(radians(catAngle*catDirection));
    push();
    scale(0.7);
    rotate(radians(-20));
    catTail(-50, 250, catAngle*catDirection); 
    pop();
    pop();

    // cat tail animation
    if (dist(60, 50, mouseX, mouseY) < 50) { 
        push();
        rotate(radians(catAngle*catDirection));
        push();
        scale(0.7);
        rotate(radians(-20));
        catTail(-50, 250, catAngle*catDirection); 
        pop();
        pop();
    
        catAngle -= 1;
        if (catAngle < -10) {
            catAngle = -10;
        }

        } if (dist(40, 120, mouseX, mouseY) < 50) {
            catAngle += 1;
            if (catAngle > 10){
                catAngle = 10;
            }
   
        }
    }

// my catalogue of functions 

function cat(x, y, w, h) { 
    fill(50);
    noStroke();
    ellipse(x/2, y/2, 50, 50);
    ellipse(x/2 + 17, y/2 + 5, 25, 28);
    ellipse(x/2 - 20, y/2 + 65, 70, 100);
    arc(x/2 - 20, y/2 + 120, 90, 70, radians(180), radians(0));

    triangle(x/2 + 5, y/2 - 15, x/2 + 20, y/2 - 15, x/2 + 13, y/2 - 35);
    triangle(x/2 - 5, y/2 - 15, x/2 - 20, y/2 - 15, x/2 - 13, y/2 - 35);

    bezier(x/2 - 20, y/2 + 5, x/2 - 30, y/2 + 30, x/2 - 30, y/2 + 20, x/2 - 40, y/2 + 25);
    bezier(x/2 + 10, y/2 + 20, x/2 + 5, y/2 + 30, x/2 + 5, y/2 + 40, x/2 + 13, y/2 + 55);
}

function catTail(x, y, catAngle) {
    noStroke();
    beginShape();
    curveVertex(x, y);
    curveVertex(x, y);
    curveVertex(x - 5, y + 40);
    curveVertex(x + 20, y + 100);
    curveVertex(x + 80, y + 140);
    curveVertex(x + 150, y + 150);
    curveVertex(x + 160, y + 140);
    curveVertex(x + 145, y + 120);
    curveVertex(x + 70, y + 100);
    curveVertex(x + 40, y + 50)
    curveVertex(x + 30, y);
    curveVertex(x + 30, y);
    endShape();
}

function triangleWindow(triangleWindowX, triangleWindowY) {
    fill(244, 244, 211);
    quad(triangleWindowX, triangleWindowY, triangleWindowX -5, triangleWindowY + 15, triangleWindowX + 200, triangleWindowY + 15, triangleWindowX + 200, triangleWindowY);
}

function happyWindow() {
    rect(happyMouthX, happyMouthY, 50, 15);
}

function skyWindow() {
    fill(244, 244, 211);
    rect(skyScraperX, skyScraperY, 20, 20);
} 

function newMoon(newX, newY, w, h) {
    outline = 55;
    inline = 50;

    stroke(255);
    fill(redValue, greenValue, blueValue);
    ellipse(newX, newY, outline, outline);
    ellipse(newX, newY, inline, inline);
}
   
function crescentMoon(crescentX, crescentY, w, h) {
    outline = 55;
    inline = 50;

    fill(255);
    ellipse(crescentX, crescentY, inline, inline);
    fill(redValue, greenValue, blueValue);
    noStroke();
    rect(115, 80, outline/2, outline)
    stroke(255);
    noFill();
    ellipse(crescentX, crescentY, outline, outline);
    fill(redValue, greenValue, blueValue);
    noStroke();
    ellipse(crescentX, crescentY, inline/2, inline);
}
   
function gibbousMoon(gibbousX, gibbousY, w, h) {
    outline = 55;
    inline = 50;

    noStroke();
    fill(255);
    ellipse(gibbousX, gibbousY, inline, inline);
    fill(redValue, greenValue, blueValue);
    noStroke();
    fill(redValue, greenValue, blueValue);
    rect(190, 24, outline/2, outline);
    stroke(255);
    noFill();//Outline
    ellipse(gibbousX, gibbousY, outline, outline);
    fill(255)
    arc(gibbousX, gibbousY, inline/2, inline, PI/2, -PI/2);
}

function fullMoon (fullX, fullY, w, h) {
    outline = 55;
    inline = 50;

    noFill();
    stroke(255);
    ellipse(fullX, fullY, outline, outline);
    fill(255);
    ellipse(fullX, fullY, inline, inline);
}

function starrySky() {
    noStroke();
    fill(253, 253, 150);

    circle(140, 30, starDiam/5);
    circle(275, 136, starDiam/7);
    circle(61, 303, starDiam/4);
    circle(167, 38, starDiam/6);
    circle(10, 34, starDiam/7);
    circle(163, 147, starDiam/3);
    circle(292, 121, starDiam/8);
    circle(154, 328, starDiam/5);
    circle(360, 15, starDiam/2);
    circle(19, 386, starDiam/6);
}


// ALL moon functions were made by brantschen at https://editor.p5js.org/brantschen/sketches/bGH-klhrY
// cat mechanics inspired by jiatong li

Project-03-Dynamic-Drawing Section D

I enjoyed the freeform in this project which was more open-ended. I had lots of fun playing tricks on the eye in addition to the mouse interaction. Move your mouse left and right and see what happens!!

dynamic drawing sketch
var angle = 0;
var x;
var y;
var w = 80;
var h = 80;
var xe;
function setup() {
    createCanvas(600, 450);
    background(220);
    frameRate(15); 
    
}

function draw() {
    background(204);
    var x = width/2;
    var y = height/2;
    var xe = width/2;
    var ye = height/2;
    

    angle = angle + 1; 
    if (mouseX <= width/2) {  // when mouse moves to left
        background(255); // black background
        // make square bigger
        w = w + 8;
        h = h + 8;

        // bigger white rectangle
        push();
        translate(x,y);   
        rotate(-angle);
        rectMode(CENTER);
        fill (0);
        rect(0, 0, w*20, h*20);
        pop();
        //bigger white circle
        fill(255);
        ellipse(xe, ye, w*17); 
        // big black rectangle 
        push();
        translate(x,y);   
        rotate(angle);
        rectMode(CENTER);
        fill (0);
        rect(0, 0, w*10, h*10);
        pop();
        // big white circle
        fill(255);
        ellipse(xe, ye, w*8);  
        // black rectangle
        push();   // this keeps whatever code that is inside push and pop "self contained" without affecting other code/ "undo"
        translate (x,y);
        rotate(-angle); 
        rectMode(CENTER);
        fill(0);
        rect(0, 0, w*4, h*4);
        // draw black ellipse in center of square
        pop(); 
        fill(255);
        ellipse (xe, ye, w*3);  
         // square inside of ellipse that rotates the opposite direction 
        push();
        translate(x,y);  
        rotate(angle);
        rectMode(CENTER);
        fill(0);
        rect(0, 0, w, h);
        pop();
        // small white circle that approaches center
        push();
        translate(300, 225);
        rotate(radians(angle)); 
        ellipse(xe -100, ye - 100, 50);
        pop();
        angle = angle + 8; // used to be 50

        
    } else if (mouseX >= width/2) {  // when mouse moves to right
        background(0); // white background
        // make square bigger
        w = w - 8; 
        h = h - 8;
         // bigger black rectangle
        push();
        translate(x,y);   
        rotate(angle);
        rectMode(CENTER);
        fill (255);
        rect(0, 0, w*20, h*20);
        pop();
        // bigger black circle
        fill(0);
        ellipse(xe, ye, w*17); 
        // big white rectangle
        push();
        translate(x,y);   
        rotate(-angle);
        rectMode(CENTER);
        fill (255);
        rect(0, 0, w*10, h*10);
        pop();
        // really big black circle
        fill(0);
        ellipse(xe, ye, w*8);  
        // big white rectangle
        push();
        translate (x,y);  
        rotate(angle); 
        rectMode(CENTER);
        fill(255);
        rect(0, 0, w*4, h*4);
        pop();
        // smaller black circle 
        fill(0);
        ellipse (xe, ye, w*3); 
        // white rectangle that rotates in opposite direction
        fill(255);        
        translate(x,y);  
        rotate(-angle);
        rectMode(CENTER);
        fill(255);
        rect(0, 0, w, h);
        // small black circle with white outline that approaches center
        push();
        translate(300, 225);
        rotate(radians(angle)); 
        stroke(255);
        fill(0);
        ellipse(xe -100, ye - 100, 50);
        pop();
        angle = angle - 8;

    }
}
    

anabelle’s blog 03

Some works that have always stunned me are by the fashion designer Iris van Herpen. Her designs uniquely merge nature and technology by using 3D printed fabrics to reproduce patterns and parametric structures from the natural world. I have always thought her works were the representatives for fashion as an artform. Anecdotally, you’d think that 3D printed fabrics would be stiff and lackluster, but her pieces capture motion with incredible fluidity, thus proving her mastery of design and knowledge of nature. I imagine the algorithms contain something similar to the forLoops that we’ve discussed in this course — there are a lot of repetitive shapes with slight transformations to build a grand, cohesive piece. My personal favorite collection that she’s done is “Syntopia.” There’s something so ethereal, futuristic, but organic about it. Generally, I don’t keep up with the fashion scene, but her works have never failed to impress me.

link to Syntopia: https://www.irisvanherpen.com/collections/ludi-naturae

Neri Oxman’s Man-Nahata: Looking Outwards-03

Neri Oxman has been a huge inspiration to me since I saw her featured on Netflix’s Abstract series. The concept of biomimicry (which is honestly more of a return to what was than a new concept) holds incredibly poignant as human innovation seems to split the sides of the uncanny valley and either try with incredible effort to mimic analog, natural, or otherwise older design ideas, or shoot beyond anything that has ever been imagined. Oxman’s most recent published project is entitled ‘Man-Nahata,’ the Native American word for the island of Manhattan. It imagines, if Manhattan were to undergo an collision wiping out its population, what the biological regrowth might look like, using ecological data from the island pre-colonization and also the current grid layout and zoning of the city. How might nature rebuild, and how might we rebuild around her? Generative algorithms imagine and plot how nature might overtake the current architecture, and how our city planning could influence a natural process.

Sample artistic generation of biological creep into future Manhattan.

Project 03-Dynamic Drawing

I went poking around the p5js reference library and found a really intriguing example in the randomGaussian() object so I decided to run with that and see what I could do with that. mouseX controls the properties of the yellow burst, and mouseY the blue. Click to randomize the burst lines, and click and drag to shade the background along greyscale.

sketchDownload
// Bridget Doherty, bpdohert, 104 Section C
 
// Click to randomize burst density
// mouse X position changes yellow burst
// mouse Y position changes blue burst
// Clicking & dragging changes background color along greyscale

// Base code for bursts from p5js reference >> randomGaussian() object

let distribution = new Array(360);
var Burst1 = 200;
var Burst2 = 200;
let bkgColor = 0;

function setup() {
  createCanvas(600, 450);
  for (let i = 0; i < distribution.length; i++) {
    distribution[i] = floor(randomGaussian(0, Burst1));
  }
  for (let i2 = 0; i2 < distribution.length; i2++) {
    distribution[i2] = floor(randomGaussian(0, Burst2));
  }
}

function draw() {
  background(bkgColor);
  translate(width / 2, height / 2);
  for (let i = 0; i < distribution.length; i++) {
    rotate(TWO_PI / distribution.length);
    strokeWeight(1.5);
    stroke(color(243, 197, 101));
    let dist = abs(distribution[i]);
    line(0+mouseX, 0, dist, 0);
  }
  for (let i2 = 0; i2 < distribution.length; i2++) {
    rotate(TWO_PI / distribution.length);
    stroke(color(158, 182, 187));
    let dist = abs(distribution[i2]);
    line(0, 0+mouseY, dist, 0);
  }
}

function mousePressed(){
  let Burst1 = mouseX;
  let Burst2 = mouseY;
  print (Burst1 +", " + Burst2);
  for (let i = 0; i < distribution.length; i++) {
    distribution[i] = floor(randomGaussian(0, Burst1));
  }
  for (let i2 = 0; i2 < distribution.length; i2++) {
    distribution[i2] = floor(randomGaussian(0, Burst2));
  }
}

function mouseDragged() {
  bkgColor = bkgColor - 0.7;
  if (bkgColor<=0) {
    bkgColor = 255;
  }
}

Project 03: Alexia Forsyth

sketch
//Alexia Forsyth
//aforsyth
//Section A

var hVelocity = 50;
var vVelocity = 50;

var w = 50;
var h = w * .8;

var count = 0;

var drawing = true;

r = 20;
g = 100;
b = 120;

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

function draw() {
	if (drawing == true){
	print("Move your mouse to draw...")
	print(count);

	if (count == 50 || count == 100 || count == 150 || count == 200){
		w = 70;
		r = random(5,50);
		g = random(50,200);
		b = random(50,220);
	}
	else if (count == 300){
		drawing = false;
	}

	if (random(3) <= 1){
		fill(r, g, b);
	}
	else if (random(3) > 1 & random(3) < 2){
		fill(r+(.88*r), g+(.33*g), b+(.26*b));
	}
	else{
		fill(r+(3*r), g+(.59*g), b+(.37*b));
	}

	ellipse(mouseX,mouseY, w, h);

	if(mouseX >= width || mouseY >= height || mouseY <= 0 || mouseX <= 0){
		hVelocity = -hVelocity;
		vVelocity = -vVelocity;
		count += 1;
	}
	
}
else{
	print("Stop");
}

}

Some of my examples:

Project 02- Variable Faces

efleischer -02 – project
/* 
    eliana fleischer
    efleisch
    section e
*/

//Global variables to be used across different functions
//these are all the variables that will be used to make the initial face before randomization.

var eyewidth = 20;
var eyeheight = 20;
var faceshape = 1;
var facewidth = 200;
var faceheight = 200;
var eyecolorR = (15);
var eyecolorG = (255);
var eyecolorB = (100);
var noseheight = 5;
var nosewidth = 5;
var iris = 10;
var skinR = 100;
var skinG = 100;
var skinB = 100;
var x = 320;
var y = 240;


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

function draw() {

    background(eyecolorR, eyecolorG, eyecolorB); // sets background to the random variables for the eye color
    //faces 
    push();
    fill(skinR,skinG, skinB);
    noStroke()
    if (faceshape == 1){

        face1 = ellipse(x,y, facewidth, faceheight); //draws ellipse face

    } else {

        face2 = rect(x - facewidth /2 , y - faceheight /2 , facewidth , faceheight); //draws square face
    }

    //nose
    fill(255, 204, 255)
    nose = ellipse(x, y, noseheight, nosewidth); //draws nose at the center of the face
    pop();

    //eyes
    fill(255); //white fill for irises
    strokeWeight(2); // outline for eyes
    Leye = arc(x - facewidth / 5, y - faceheight / 5, eyewidth, eyeheight, 0, PI + QUARTER_PI, OPEN); //draws left eye
    Reye = arc(x + facewidth / 5, y - faceheight / 5, eyewidth, eyeheight,100, PI + QUARTER_PI, OPEN); //draws right eye

    //iris
    fill(eyecolorR, eyecolorG, eyecolorB); // fills in the irises with the random eye color
    Riris = ellipse(x + facewidth / 5, y - faceheight / 5, iris, iris)
    Liris = ellipse(x - facewidth / 5, y - faceheight / 5, iris, iris);

    //mouth
    strokeWeight(1);
    mouth = line(x - facewidth / 5, y + faceheight / 5, x + facewidth / 5, y + faceheight / 5 );

}


function mousePressed() {

    // when the user clicks, these variables are reassigned


    facewidth = random(100, 200);
    faceheight = random(100, 200);
    eyewidth = random(15, 45);
    eyeheight = random(10, 45);
    nosewidth = random(5,15);
    noseheight = random(5,15);
    iris = random(1, 7);
    eyecolorR = random(0,255);
    eyecolorG = random(0,255);
    eyecolorB = random(0,255);
    faceshape = int(random(1,3));
    skinR = random(100,200);
    skinG = random(100,200);
    skinB = random(100,200);
}

The most difficult part of this project for me was figuring out a creative solution to increase variability and actually make unique and distinct images through randomization.

LookingOutwards-03

Learning Human-environment Interactions using Conformal Tactile Textiles details Sense Textiles, a project in 2021 constructed by Yiyue Luo, Yunzhu Li, Pratyusha Sharma, Wan Shou, Kui Wu, Michael Foshey, Beichen Li, Tomás Palacios, Antonio Torralba, and Wojciech Matusik. It was quite fascinating to see how a need in the medical and scientific field could prompt the creation of something that mimicked and monitored human-environment interactions. In addition, it was also quite fascinating to see how these results could be used to apply to human behavior and predicting almost psychologically-related fields. To the best of my knowledge, the algorithm that comprised it utilized artificial intelligence to identify human poses and different interactions with its environment through sensory textiles. The creators, albeit focusing on the more technical aspects of the textile, did have the sense to make it so that the textile looked somewhat aesthetically pleasing. The form was nice, the graphics demonstrated with clarity what the effects of the sense textile accomplished.

More on the project here

Shown above, here is a sample of the textiles and their visualized impacts

Looking Outwards 03

MINIMA | MAXIMA photo by NAARO

https://www.archdaily.com/879626/minima-maxima-marc-fornes-theverymany

Marc Fornes’ parametric pavilion, entitled “MINIMA|MAXIMA” is a 2017 project created by the research collective THEVERYMANY for the 2017 World Expo in Astana, Kazakhstan. This 43’ tall pavilion is designed using parametric architecture techniques including Rhinoscripting. Not only does Grasshopper (the generative modeling tool in the software Rhino) allow one to easily manipulate dimensions and shapes as well as the size of the individual panels, it can be used in conjunction with Python to create more complex geometries. Although the sculptural piece consists of only curves, the individual pieces of ultra-thin material are all created as flat surfaces, and only when interconnected do they take on their curved form. Although the construction of the pavilion is similar to the construction process of carbon fiber assembly, the structure is made of 6mm thick sheets of aluminum, stacked together to make a sandwich of white, pink, and white. Fornes and his collaborators continue to develop their research regarding the material and assembly tchniques used in their pavilions and treat each structure as a research opportunity. The cutting-edge assembly techniques used by THEVERYMANY, as well as the uniquely thin yet self-supporting construction material, are two incredibly admirable aspects of the pavilion.