Concept / Idea:
For this assignment, I was inspired by the human body, which I think is one of nature’s greatest wonders. More specifically not by its physical ability, but by its visual potential. What I mean by its visual potential is the ability of the body to grab & maintain attention, visually communicate thought & emotion, and finally visually evoke feelings in others.

With the body there’s this dichotomy, on one side there is this element of commonality or basic core structure, a “skeleton, but on the other side, there’s nuance, subtleties, and little differences that produce individual uniqueness out of extreme diversity. This reminds me a lot of generative art & object-oriented programming & I really wanted to bring both together.

The human body has always been a popular subject in art throughout history, religious, official, and personal & I thought I’d extend that tradition by tackling it in this new medium I’m learning (p5.js)
Logic:
I started out looking at the skeleton of things, trying to come up with what the cookie cutter of a body or face would be like. I divided the body into two different categories, “the headless body” and “the face” because I think each of these has a unique separate visual quality that I wanted to tackle.
The headless body:
This sketch is running in WEBGL, and uses multiple planes placed in the same x & y coordinates but different z coordinates. Initially, the logic behind this was to have planes at different opacities and sizes overlayed / stacked to look like a body.
Scaling up:
Some code I want to highlight:
constructor(size,leader) {
this.pos = createVector();
this.humansList = [new Human(this.mouse)];
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].footRight));
} else if (this.type < 2) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
} else if (this.type < 3) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].footRight));
this.humansList.push(new Human(this.humansList[i].hipLeft));
} else if (this.type < 4) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.mouse));
} else if (this.type < 5) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].handLeft));
this.humansList.push(new Human(this.humansList[i].waist));
this.humansList.push(new Human(this.humansList[i].shoulderRight));
for (let i = 0; i < this.size; i++) {
this.humansList[i].render();
class Cluster {
constructor(size,leader) {
this.mouse = leader;
this.pos = createVector();
this.humansList = [new Human(this.mouse)];
this.size = 10;
this.type = random(5);
if (this.type < 1) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].footRight));
}
} else if (this.type < 2) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
}
} else if (this.type < 3) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].footRight));
this.humansList.push(new Human(this.humansList[i].hipLeft));
}
} else if (this.type < 4) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.mouse));
}
} else if (this.type < 5) {
for (let i = 0; i < this.size; i++) {
if (i < this.size / 2) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].handLeft));
} else {
this.humansList.push(new Human(this.humansList[i].waist));
this.humansList.push(new Human(this.humansList[i].shoulderRight));
}
}
}
}
render() {
for (let i = 0; i < this.size; i++) {
this.humansList[i].render();
}
}
}
class Cluster {
constructor(size,leader) {
this.mouse = leader;
this.pos = createVector();
this.humansList = [new Human(this.mouse)];
this.size = 10;
this.type = random(5);
if (this.type < 1) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].footRight));
}
} else if (this.type < 2) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
}
} else if (this.type < 3) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].footRight));
this.humansList.push(new Human(this.humansList[i].hipLeft));
}
} else if (this.type < 4) {
for (let i = 0; i < this.size; i++) {
this.humansList.push(new Human(this.mouse));
}
} else if (this.type < 5) {
for (let i = 0; i < this.size; i++) {
if (i < this.size / 2) {
this.humansList.push(new Human(this.humansList[i].handRight));
this.humansList.push(new Human(this.humansList[i].handLeft));
} else {
this.humansList.push(new Human(this.humansList[i].waist));
this.humansList.push(new Human(this.humansList[i].shoulderRight));
}
}
}
}
render() {
for (let i = 0; i < this.size; i++) {
this.humansList[i].render();
}
}
}
This code changes how different skeletons are connected to each other based on a random number to create variations that add up and can be seen in a cluster’s shape/movement.
XY Plotter result:

https://drive.google.com/file/d/1gGS_PLDxK66WoZ4x9QCe_aWjSFaERHGQ/view
https://drive.google.com/file/d/14HSQoOd8wGrcDyLQdTE86XtFZQxG5-bO/view
The Face:
Some code I want to highlight:
this.pos = createVector(0, 0);
this.eyeheight = 2 * random(0.6, 1.4);
this.eyewidth = 10 * random(0.6, 1.2);
this.eyetilt = createVector(random(-0.3, 0.4), random(-0.3, 0.4));
this.eyeslope = random(1, 1.5);
translate(this.pos.x, this.pos.y);
for (let i = 0; i <= 10; i++) {
let w = map(i, 0, 10, PI, 0);
let x = map(i, 0, 10, this.eyewidth / 2, -this.eyewidth / 2);
let y = this.eyeheight * -sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.x;
vertex(x * multiplier, y * multiplier);
for (let i = 0; i <= 10; i++) {
let w = map(i, 0, 10, 0, PI);
let x = map(i, 0, 10, -this.eyewidth / 2, this.eyewidth / 2);
let y = this.eyeheight * sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.y;
vertex(x * multiplier, y * multiplier);
for (let i = 0; i <= 1; i++) {
let w = map(i, 0, 10, PI, 0);
let x = map(i, 0, 10, this.eyewidth / 2, -this.eyewidth / 2);
let y = this.eyeheight * -sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.x;
vertex(x * multiplier, y * multiplier);
ellipse(0, 0, this.eyeheight * 15);
class Eye {
constructor() {
this.pos = createVector(0, 0);
this.eyeheight = 2 * random(0.6, 1.4);
this.eyewidth = 10 * random(0.6, 1.2);
this.r = this.eyeheight;
this.eyetilt = createVector(random(-0.3, 0.4), random(-0.3, 0.4));
this.eyeslope = random(1, 1.5);
}
render() {
let multiplier = 10;
push();
translate(this.pos.x, this.pos.y);
fill(255);
beginShape();
for (let i = 0; i <= 10; i++) {
let w = map(i, 0, 10, PI, 0);
let x = map(i, 0, 10, this.eyewidth / 2, -this.eyewidth / 2);
let y = this.eyeheight * -sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.x;
vertex(x * multiplier, y * multiplier);
}
for (let i = 0; i <= 10; i++) {
let w = map(i, 0, 10, 0, PI);
let x = map(i, 0, 10, -this.eyewidth / 2, this.eyewidth / 2);
let y = this.eyeheight * sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.y;
vertex(x * multiplier, y * multiplier);
}
for (let i = 0; i <= 1; i++) {
let w = map(i, 0, 10, PI, 0);
let x = map(i, 0, 10, this.eyewidth / 2, -this.eyewidth / 2);
let y = this.eyeheight * -sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.x;
vertex(x * multiplier, y * multiplier);
}
endShape();
fill(0);
ellipse(0, 0, this.eyeheight * 15);
pop();
}
}
class Eye {
constructor() {
this.pos = createVector(0, 0);
this.eyeheight = 2 * random(0.6, 1.4);
this.eyewidth = 10 * random(0.6, 1.2);
this.r = this.eyeheight;
this.eyetilt = createVector(random(-0.3, 0.4), random(-0.3, 0.4));
this.eyeslope = random(1, 1.5);
}
render() {
let multiplier = 10;
push();
translate(this.pos.x, this.pos.y);
fill(255);
beginShape();
for (let i = 0; i <= 10; i++) {
let w = map(i, 0, 10, PI, 0);
let x = map(i, 0, 10, this.eyewidth / 2, -this.eyewidth / 2);
let y = this.eyeheight * -sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.x;
vertex(x * multiplier, y * multiplier);
}
for (let i = 0; i <= 10; i++) {
let w = map(i, 0, 10, 0, PI);
let x = map(i, 0, 10, -this.eyewidth / 2, this.eyewidth / 2);
let y = this.eyeheight * sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.y;
vertex(x * multiplier, y * multiplier);
}
for (let i = 0; i <= 1; i++) {
let w = map(i, 0, 10, PI, 0);
let x = map(i, 0, 10, this.eyewidth / 2, -this.eyewidth / 2);
let y = this.eyeheight * -sin(w);
y -= this.eyeheight * sin(w * this.eyeslope) * this.eyetilt.x;
vertex(x * multiplier, y * multiplier);
}
endShape();
fill(0);
ellipse(0, 0, this.eyeheight * 15);
pop();
}
}
I used different sine waves with phases & amplitudes that change at random and added them together to get different shapes of eyelids.
Scaling up:




Putting them together:
https://youtu.be/Q_Og8rGYwWs
