Looking Outwards 05 – 3D Computer Graphics

One of my favorite musical artists, Carpenter Brut, released a music video about 4 years ago for his song “Turbo Killer”. The basic premise of the video was a world where machines were living (and hence called “blood machines”) and due to their power were highly coveted and fought over. The video was directed and written by Seth Ickerman, a Paris-based CGI artist whose goal was to capture the over-the-top 80s feel of Carpenter Brut’s heavy synth music. 

The video features a myriad of special effects that synergize to create this 80s atmosphere, of which 3D graphics plays a major role. Most of the video was comprised of CGI in some form, with only close-up shots of real actors shot live and superimposed onto a CGI set. Some of the CGI models used in the video are detailed to an extreme amount, leading me to believe they were not all modeled manually by hand. Generative design in certain scenes and models seem to help Ickerman model faster as well as depicting a more organic feel to these machines.

Project 05 – Wallpaper

Too much Among Us was played in the making of this wallpaper.

Cyan sus.

sketch
/*
 *Eric Zhao
 *ezhao2@andrew.cmu.edu
 *
 *Draws a wallpaper consisting of a "3D lattice"
 *and Among Us sprites.
 */

var w = 50; //pillar length and height
var s = 10; //pillar width
var pillarHue = 101;
var pillarLight = 75;
var pillarDark = 25;

function setup() {
    colorMode(HSB);
    createCanvas(600, 600);
    background(16, 34, 93);

}

function draw() {
    //draws the lattice of pillars
    for(let i = 0; i < 12; i++){
        for(let j = 0; j < 12; j++){
            if((i+j) % 2 == 0){
                pillar2(i*w, j*w, s, w, pillarHue, pillarLight, pillarDark);
            } else{
                pillar(i*w, j*w, s, w, pillarHue, pillarLight, pillarDark);
            }
        }
    }
    //draws the Among Us sprites on rows with odd numbers of spaces
    for(let i = 0; i < height; i += 2*w){
        push();
        translate(0, i);
        for(let j = 0; j < width-w; j += 2*w){
            push();
            translate(j + w/2, w/2);
            scale(0.45);
            amongUs();
            pop();
        }
        pop();
    }
    translate(w, w);
    //draws the Among Us sprites on rows with even numbers of spaces
    for(let i = 0; i < height-2*w; i += 2*w){
        push();
        translate(0, i);
        for(let j = 0; j < width-2*w; j += 2*w){
            push();
            translate(j + w/2, w/2);
            scale(0.45);
            amongUs();
            pop();
        }
        pop();
    }
    //shh, here's the impostor!
    translate(width/3+15, height/3-2);
    scale(0.2);
    knife();
    noLoop();
}

function pillar(x, y, s, w, hue, light, shadow){
    //pillar function drawing a lattice element top left to bottom right
    fill(hue, 40, shadow);
    quad(x, y, x+s, y, x+w, y+w-s, w+x, w+y);
    fill(hue, 40, light);
    quad(x, y, w+x, w+y, w-s+x, w+y, x, s+y);

}

function pillar2(x, y, s, w, hue, light, shadow){
    //pillar function drawing a lattice element bot left to top right
    fill(hue, 40, shadow);
    quad(x, y+w, x+w, y, x+w, y+s, x+s, y+w);
    fill(hue, 40, light);
    quad(x, y+w, x, y+w-s, x+w-s, y, x+w, y);
}

function amongUs(){
    //creates an Among Us sprite lookalike
    push();
    noStroke();
    fill(50);
    ellipse(53, 94, 70, 15); //shadow
    backpack();
    body();
    visor();
    pop();
}
function body(){
    //Among Us sprite body
    //body base color
    noStroke();
    fill(187, 100, 76);
    beginShape();
    curveVertex(59, 76);
    curveVertex(59, 76);
    curveVertex(62, 88);
    curveVertex(75, 88);
    curveVertex(78, 74);
    curveVertex(81, 55);
    curveVertex(79, 38);
    curveVertex(69, 7);
    curveVertex(38, 7);
    curveVertex(28, 48);
    curveVertex(32, 91);
    curveVertex(50, 91);
    curveVertex(52, 76);
    curveVertex(59, 76);
    curveVertex(59, 76);
    endShape();

    //body highlight color
    fill(172, 56, 80);
    beginShape();
    curveVertex(45, 62);
    curveVertex(45, 62);
    curveVertex(70, 63);
    curveVertex(79, 38);
    curveVertex(69, 7);
    curveVertex(45, 4);
    curveVertex(36, 32);
    curveVertex(39, 54);
    curveVertex(45, 62);
    curveVertex(45, 62);
    endShape();

    //outline
    stroke(0);
    strokeWeight(6);
    noFill();
    beginShape();
    curveVertex(59, 76);
    curveVertex(59, 76);
    curveVertex(62, 88);
    curveVertex(75, 88);
    curveVertex(78, 74);
    curveVertex(81, 55);
    curveVertex(79, 38);
    curveVertex(69, 7);
    curveVertex(38, 7);
    curveVertex(28, 48);
    curveVertex(32, 91);
    curveVertex(50, 91);
    curveVertex(52, 76);
    curveVertex(59, 76);
    curveVertex(59, 76);
    endShape();
}

function backpack(){
    //Among Us backpack (body colored)
    noStroke();
    //backpack base color
    fill(187, 100, 76);
    beginShape();
    curveVertex(33, 27);
    curveVertex(33, 27);
    curveVertex(19, 31);
    curveVertex(17, 69);
    curveVertex(30, 72);
    curveVertex(30, 72);
    endShape();

    //backpack highlight
    fill(172, 56, 80);
    beginShape();
    curveVertex(33, 27);
    curveVertex(33, 27);
    curveVertex(19, 28);
    curveVertex(18, 39);
    curveVertex(33, 36);
    curveVertex(33, 36);
    endShape();

    strokeWeight(6);
    noFill();

    //outline
    stroke(0);
    strokeWeight(6);
    noFill();
    beginShape();
    curveVertex(33, 27);
    curveVertex(33, 27);
    curveVertex(19, 31);
    curveVertex(17, 69);
    curveVertex(30, 72);
    curveVertex(30, 72);
    endShape();
}
function visor(){
    //Among Us visor section
    strokeWeight(6);
    noStroke();
    fill(193, 38, 43);
    ellipse(64, 28, 35, 25);
    fill(196, 36, 87);
    ellipse(67, 24, 25, 18);
    fill(0, 0, 100);
    ellipse(68, 24, 15, 5);
    //outline
    stroke(0);
    noFill();
    ellipse(64, 28, 35, 25);
}

function knife() {
    //for the killer only...
    strokeWeight(2);
    fill(0, 0, 37);
    rect(0, 0, 15, 30);
    fill(11, 67, 51);
    rect(-10, 30, 35, 15);
    fill(0, 0, 50);
    triangle(-5, 45, 7.5, 100, 20, 45);
    noStroke();
    fill(0, 0, 85);
    triangle(7.5, 45, 7.5, 100, -5, 45);
    noFill();
    stroke(0);
    triangle(-5, 45, 7.5, 100, 20, 45);
    noLoop();
}

Looking Outwards-05

https://www.behance.net/gallery/40600473/FREE-BIRD

This collection is named “Free Bird” and is by Mike Campau. He’s a photographer who uses CGI to distort components of reality. Normally, he makes commercial art/graphics for companies like Beats by Dre, Under Armour, Nike, etc., but he also does personal projects like the one shown. In this collection, I like the way that he distorted that he used CGI to distort the bird cages. The statement included with it is “an escape from the odd and dark world we live in… and sometimes there are no doors to get out.” I think that the distortion of the cages helps convey the complexity of the problems people try to escape and creates a very somber and imposing mood. I don’t understand where the doors come in to play though. I’m guessing we are supposed to question how the bird managed to get out of the cage in the first place and wonder why the bird is still sitting on the cage if it managed to get out which I find interesting. He says that he made this in Photoshop to make this. I know that you can make 3D models and texture them in Photoshop, but I’ve never done it before so I couldn’t say exactly how he did it. Also, the bird a real bird and not a 3D model.

Project-05-Wallpaper

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

function draw() {

    	

        
    
    //big pumpkins
    for(var s = 100; s < height-90; s +=400){
    	for(var d = 100; d < width-80; d+=400){
            pumpkin1(d, s);
        
        }
    }

    for(var s = 300; s < height-90; s +=400){
    	for(var d = 300; d < width-80; d+=400){

            pumpkin1(d, s);
        
        }
    }
     //little pumpkins
     for(var m = 300; m < height-90; m +=400){
     	for(var j = 100; j < width-80; j+=400){

       pumpkin2(j, m);
       
        }

    }

    for(var m = 100; m < height-90; m +=400){
     	for(var j = 300; j < width-80; j+=400){

       pumpkin2(j, m);
       
        }

    }
	       

    //star
    for(var s = 100; s < height+50; s +=200){
    	for(var d = 0; d < width+50; d+=200){
            star1(d, s);
        
        }
    }

    //star
    for(var s = 0; s < height+50; s +=200){
    	for(var d = 100; d < width+50; d+=200){
            star2(d, s);
        
        }
    }

}

    
//big pumpkin
	function pumpkin1(x,y) {

        
           
           push();
           translate(x,y);
           rotate(radians(20));
           noStroke();
           //strokeWeight(1.5);

           //stroke(0, 100, 20);
           fill(0, 198, 51);
           rect(-5, -35, 10, 13);

           //stroke(176, 45, 36);
           fill(241, 90, 41);

           ellipse(25, 3, 40, 60);
           ellipse(-25, 3, 40, 60);
           ellipse(13, 3, 40, 62);
           ellipse(-13, 3, 40, 62);
           ellipse(0, 3, 40, 64);

           fill(247, 148, 29);
           triangle(-20, -5, -4, -2, -12, -16);
           triangle(20, -5, 4, -2, 12, -16);
           triangle(-6, 8, 6, 8, 0, -2);

           arc(1, 11.5, 55, 29, radians(0), radians(180), CHORD);

           fill(241, 90, 41);
           
           rect(9, 10, 8, 5.5);
           noStroke();
           rect(8, 7, 9.9, 4);


           
	       pop();
	              

}

//little pumpkin
	function pumpkin2(x,y) {

        
           
           push();
           translate(x,y);
           rotate(radians(-20));
           noStroke();
           //strokeWeight(1.5);

           //stroke(0, 100, 20);
           fill(0, 198, 51);
           rect(-5, -20, 10, 13);

           //stroke(176, 45, 36);
           fill(241, 90, 41);

           ellipse(20, 5, 30, 40);
           ellipse(-20, 5, 30, 40);
           ellipse(10, 5, 30, 40);
           ellipse(-10, 5, 30, 40);
           ellipse(0, 5, 30, 40);

           fill(247, 148, 29);
           ellipse(-10, 2, 10, 10);
           ellipse(10, 2, 10, 10);
           rect(-2, 2, 4, 4);

           arc(0, 10, 20, 15, radians(0), radians(180), CHORD);

           fill(241, 90, 41);
           
           rect(3, 8.2, 4, 4);
           noStroke();
           rect(2, 7.2, 6, 2.1);


           
	       pop();
	              

}

//big star

function star1(x, y) {


	 push();
           translate(x,y);
           strokeWeight(1.5);
           rotate(radians(-20));

           fill(255, 251, 202);

           beginShape();
           vertex(-16, -3.5);
           vertex(-5, -5);
           vertex(0,-16);
           vertex(5, -5);
           vertex(16, -3.5);
           vertex(8, 4);
           vertex(10, 16);
           vertex(0, 10);
           vertex(-10, 16);
           vertex(-8, 4);
           endShape(CLOSE);
	       pop();


}

//small star

function star2(x, y) {


	 push();
           translate(x,y);
           strokeWeight(1.5);
           rotate(radians(20));

           fill(255, 251, 202);

           beginShape();
           vertex(-8, -1.75);
           vertex(-2.5, -2.5);
           vertex(0,-8);
           vertex(2.5, -2.5);
           vertex(8, -1.75);
           vertex(4, 2);
           vertex(5, 8);
           vertex(0, 5);
           vertex(-5, 8);
           vertex(-4, 2);
           endShape(CLOSE);
	       pop();


}

Project 05- Wallpaper

I created a wallpaper with illustrations of birds, rainbows, and clouds. Recently, I saw two parrots outside my window (it was odd because I live in the middle of an urban city). I was worried they might not survive the cold weather, but they flew away as my family opened the window to bring them in. I wanted to create visuals of the scene I saw that day in my wallpaper.

sketch
//Stefanie Suk
//15-104 Section D

var positionbx = 10;     //starting position x for blue bird
var positionby = 10;     //starting position y for blue bird
var offsetbx = 120;      //spacing x for blue bird
var offsetby = 140;      //spacing y for blue bird

var positionyx = 75;     //starting position x for yellow bird
var positionyy = 75;     //starting position y for yellow bird
var offsetyx = 120;      //spacing x for yellow bird
var offsetyy = 140;      //spacing y for yellow bird

var positionrx = 10;     //starting position x for rainbow
var positionry = 95;     //starting position y for rainbow
var offsetrx = 120;      //spacing x for rainbow
var offsetry = 140;      //spacing y for rainbow

var positioncx = 70;     //starting position x for cloud
var positioncy = 20;     //starting position y for cloud
var offsetcx = 120;      //spacing x for cloud
var offsetcy = 140;      //spacing y for cloud

var positiondx = 0;     //starting position x for dots
var positiondy = 0;     //starting position y for dots
var offsetdx = 20;      //spacing x for dots
var offsetdy = 20;      //spacing y for dots


function setup() {
    createCanvas(500, 600);
    background(195, 213, 195);
    noLoop();
}

function draw() {

	for(var a=0; a<50; a++){                                                        //column of grid
    	for(var b = 0; b<50; b++){                                                  //row of grid                                    
    		push();
    		translate(positiondx + offsetdx*b, positiondy + offsetdy*a);                                                            //scale down 
    		dots();
    		pop();
    	}
	}

	// blue bird grid
	for(var a=0; a<5; a++){                                                        //column of grid
    	for(var b = 0; b<5; b++){                                                  //row of grid                                    
    		push();
    		translate(positionbx + offsetbx*b, positionby + offsetby*a);
    		scale(0.5);                                                            //scale down 
    		bluebird();
    		pop();
    	}
	}

	// yellow bird grid
	for(var a=0; a<5; a++){                                                        //column of grid
    	for(var b = 0; b<5; b++){                                                  //row of grid                                    
    		push();
    		translate(positionyx + offsetyx*b, positionyy + offsetyy*a);
    		scale(0.4);														       //scale down
    		yellowbird();
    		pop();
    	}
	}

	//rainbow grid
	for(var a=0; a<5; a++){                                                        //column of grid
    	for(var b = 0; b<5; b++){                                                  //row of grid                                    
    		push();
    		translate(positionrx + offsetrx*b, positionry + offsetry*a);
    		scale(0.5);                                                            //scale down
    		rainbow();
    		pop();
    	}
	}

	//cloud grid
	for(var a=0; a<5; a++){                                                        //column of grid
    	for(var b = 0; b<5; b++){                                                  //row of grid                                    
    		push();
    		translate(positioncx + offsetcx*b, positioncy + offsetcy*a);
    		cloud();
    		pop();
    	}
	}
}

function bluebird() {
	//body 
	noStroke();
	fill(178, 232, 245);
	ellipse(0, 0, 50, 50);     //head
	ellipse(0, 40, 60, 80);
	fill(178, 232, 245);       //body
	push()
	rotate(radians(30));
	ellipse(48, 30, 10, 60)    //tail

	// white section of head
	fill(250);
	rotate(radians(220));
	arc(0, 0, 45, 45, 0, QUARTER_PI);
	pop();

	//beak
	fill(187, 201, 205);
	ellipse(4, 0, 10, 10);           //right grey circle
	ellipse(-4, 0, 10, 10);          //left grey circle
	fill(157, 170, 173);
	triangle(-6, 2, 6, 2, 0, 18);    //dark grey beak

	//eye
	fill(10);
	ellipse(10, -2, 7, 7);           //right eye
	ellipse(-10, -2, 7, 7);          //left eye

	//wings
	fill(132, 163, 170);
	ellipse(20, 40, 15, 40);         //right dark blue wing
	ellipse(-20, 40, 15, 40);        //left dark blue wing
}

function yellowbird() {
	//body 
	noStroke();
	fill(245, 242, 125);
	ellipse(0, 0, 50, 50);     //head
	ellipse(0, 40, 60, 80);
	fill(245, 242, 125);       //body
	push()
	rotate(radians(30));
	ellipse(48, 30, 10, 60)    //tail

	// orange section of head
	fill(255, 176, 117);
	rotate(radians(220));
	arc(0, 0, 45, 45, 0, QUARTER_PI);
	pop();

	//beak
	fill(212, 208, 150);
	ellipse(4, 0, 10, 10);           //right greyish yellow circle
	ellipse(-4, 0, 10, 10);          //left greyish yellow circle
	fill(151, 150, 131);
	triangle(-6, 2, 6, 2, 0, 18);    //dark greyish yellow beak

	//eye
	fill(10);
	ellipse(10, -2, 7, 7);           //right eye
	ellipse(-10, -2, 7, 7);          //left eye

	//wings
	fill(160, 212, 150);
	ellipse(20, 40, 15, 40);         //right green wing
	ellipse(-20, 40, 15, 40);        //left green wing
}

function rainbow() {
	push();
	noStroke();
	fill(255, 92, 92);
	rotate(radians(158));
	arc(0, 0, 35, 35, 0, PI+QUARTER_PI, OPEN);     //red layer
	fill(255, 156, 92);                            
	arc(0, 0, 30, 30, 0, PI+QUARTER_PI, OPEN);     //orange layer
	fill(255, 245, 92);                          
	arc(0, 0, 25, 25, 0, PI+QUARTER_PI, OPEN);     //yellow layer
	fill(160, 240, 125);                           
	arc(0, 0, 20, 20, 0, PI+QUARTER_PI, OPEN);     //green layer
	fill(125, 193, 240);                           
	arc(0, 0, 15, 15, 0, PI+QUARTER_PI, OPEN);     //blue layer
	fill(175, 125, 240);                           
	arc(0, 0, 10, 10, 0, PI+QUARTER_PI, OPEN);     //purple layer
	pop();
}

function cloud() {
	noStroke();
	fill(255);
	ellipse(0, 0, 20, 20);
	ellipse(-10, 5, 15, 15);
	ellipse(12, 4, 17, 17);
	ellipse(22, 5, 10, 10);  //white ellipses left to right
}

function dots() {
	noStroke();
	fill(255, 255, 255, 6);
	ellipse(0, 0, 5, 5);   //dots for background
}



Picture of the parrots I saw

Project 5 – Wallpaper

sketch
var f = 10;
var l = 80;
var x = 0;
var y = 0;

function setup(){
	createCanvas(600, 553);
	background(232, 225, 197);
	angleMode(DEGREES);
}

function draw(){
	for(var i = 0; i <= 12; i += 1){
		x = 60*i;
		if(i % 2 == 0){
			y = 35;
		} else {
			y = 0;
		}
		for(; y <= 600; y += 69){
			push();
			translate(x, y);
			vine();
			flower();
			leaf1();
			leaf2();
			pop();
		}
	}
}
function vine(){
	noFill();
	stroke(132, 217, 143);
	strokeWeight(2);
	arc(-l/2, 0, l, 36, 0, 60);
	arc(l/2, 0, l, 35, 180, 240);
}

function leaf1(){
	noStroke();
	fill(153, 219, 190);
	arc(0, 0, l, l, 180, 240, CHORD);
	arc(((-3 * l)/2), 0, l, l, 0, 61, CHORD);
}

function leaf2(){
	angleMode(DEGREES);
	noStroke();
	fill(173, 219, 169);
	arc(0, 0, l, l, 60, 120, CHORD);
	arc(0, 0, l, l, 240, 300, CHORD);

}

function flower(){
	noStroke();

	fill(230, 145, 172);														//petals round
	circle(f, 0, f);
	circle((f/2), ((-f * sqrt(3))/2), f);
	circle((-f/2), ((-f * sqrt(3))/2), f);
	circle(-f, 0, f);
	circle((-f/2), ((f * sqrt(3))/2), f);
	circle((f/2), ((f * sqrt(3))/2), f);

	triangle(0, 0, f, 0, (f/2), ((-f * sqrt(3))/2));							//petals fill
	triangle(0, 0, f, 0, (f/2), ((f * sqrt(3))/2));
	triangle(0, 0, (f/2), ((f * sqrt(3))/2), (-f/2), ((f * sqrt(3))/2));
	triangle(0, 0, (-f/2), ((f * sqrt(3))/2), -f, 0);
	triangle(0, 0, -f, 0, (-f/2), ((-f * sqrt(3))/2));
	triangle(0, 0, (-f/2), ((-f * sqrt(3))/2), (f/2), ((-f * sqrt(3))/2));

	fill(247, 219, 0);															//pollen
	circle(0, 0, f);
}

I based the draw code off of the hexagon assignment since most of the initial wallpaper designs I had sketched had either hexagonal or octagonal bases. Although I had wanted to do a different(but similar!) wallpaper design, trying to get certain shapes to rotate and land in the correct placement stumped me. I fully intend on trying to fulfill my original design at a later date, but I’m happy with what I’ve done for now. Images of my notes from this project below.

Looking Outwards 05 – 3D Computer Graphics

Image of  Lil Miquela from Lil Miquela’s Instagram

Miquela Sousa, also known as Lil Miquela, is a computer-generated imagery (CGI) instagram model created by Trevor McFedries and Sara DeCou. She is an active model marketing a variety of brands, primarily in fashion. When I first heard about Lil Miquela, I was amazed by the idea of creating a fictional instagram model out of computer graphics. In fact, it is stunning to see how much she grew up as a model, featuring in product endorsements for famous brands like Prada and Calvin Klein. Not only is she a model, but she is also a virtual musician. The quality of the computer graphics on Lil Miquela is more than shocking. She looks very similar to other instagram influencers, but just with a bit more filter. If you look closely at her photos on instagram, you can see the individual strokes of her hair, wrinkles, clothes, and eyelashes. Lil Miquela is a pre-rendered, computer-generated snapshots. In other words, she is a computer graphic created through photography and rendering, raxet codes and futuristic software. It is clear that the artists of Lil Miquela are very sensitive to details and realism. The fact that they use photography to create the CGI explains how precise they are to create the final form.

Lil Miquela’s Instagram: https://www.instagram.com/lilmiquela/?hl=en

Brud (AI and robotics company that creates Lil Miquela) Instagram: https://www.instagram.com/brud.fyi/?hl=en

Lil Miquela’s Hard Feelings Remix

Project 5 – Wallpaper

For this project, I was feeling the spooky, Halloween theme so I decided to make some pumpkins. 🎃

sketchDownload
var s = 20;

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

function draw() {
    background(255, 174, 0);
    for (var row = 1; row < 15; row += 2){
        for (var col = 1; col < 20; col += 3){
            blackCircle(row * 40, col * 40);

        }
    }

    for (var row = 1; row < 8; row += 2){
        for (var col = 1; col < 8; col += 2){
            pumpkin(row * 70, col * 70);

        }
    }
}

//pumpkin
function pumpkin(x, y){
    push();
    translate(x,y);
    noStroke();
    fill(54, 102, 51);
    rect(10, -30, 15, 20);
    fill(255, 85, 0);
    ellipse(20, 20, 100, 80);
    fill(0);
    triangle(0, 10, 5, 0, 10, 10);
    triangle(30, 10, 35, 0, 40, 10);
    arc(20, 20, 70, 60, 0, PI);
    fill(255, 85, 0);
    rect(20, 20, 10, 10);
    pop();
}


//blackcircle
function blackCircle(x, y){
    push();
    translate(x, y);
    noStroke();
    fill(237, 230, 9);
    circle(0, 0, 30);
    fill(0);
    circle(0, 0, 10);
    pop();
}

LO 5

One of my favorite places to explore and browse art is on Behance, an Adobe site that’s partially a job search site, partially a portfolio site, and an all-around great place to find great art. One of my favorite artists is Roman Bratschi, a 3D designer whose rendered art is filed with textures and materials that captivate the eye.

I think because I am a materially oriented person, anything with strong texture, even if it’s just the image of it, captivate my eye. Bratschi creates amazing textures in his renders that I can’t even begin to describe, and his use of vibrant and contrasting colors gives a lot of appeal to the images a well. As far as I am aware, the renders are generated through 3D software that allows for the user to tweak and adjust the form, texture, color, the density of said texture, almost anything imaginable to create renders. In its final form, Bratschi dictates the composition and generation of the art, even though he is using pre-programmed tools to help him create the images.

LO 5

“Platonic solids” by Michael Hansmeyer explores generated geometric 3D shapes that complete a complex form. He has created multiple different final forms which all stem from the same single process with a simple change in variables. I admire how such a subtle change can create a huge different in the final patterns of this 3D design. It influences the branching, fractalization, and build up of the geometric shapes. It’s also worth noting that this system can be applied to multiple scales. The processes at the core of this project have two parts: topological rules and weighting rules. Hansmeyer states that these rules specify how the positions of these vertices are based from the combinations of the vertices and the shapes edges and faces. By introducing parameters that allow for variation, the final result encapsulates a rounded and highly diverse attributes in its body.

Platonic Solids by Michael Hansmeyer

http://www.michael-hansmeyer.com/platonic-solids#:~:text=Platonic%20Solids%20(2008),primitive%20given%20an%20appropriate%20process.