Project #4 Exquisite Corpse | Lonely Universe Monster
Move your mouse and click on the canvas :)
Designed by Haoshu Yang.
Partner: Nishra, Yumeng
Background Stories
Monster
It’s a monster. It terrifies us. It makes our life aberrant. It could be
Thanos with his ambition of eliminating half of the life in the
universe. It could be a catastrophe causing millions of tragedies. It
could also be the COVID-19 that changes our everyday patterns, hurts
people and ruins families.
But it is not a portrait of a fierce evil who plays with human life. It
is a monster but it is not inevitable. It scares us at the beginning.
But after people’s rebounding together with careful researches and works
day and night, the monster could just be like what I draw on the
canvas—a controlled plush object.
Background Story 2 by Nishra:
Meet Anonymous!
They are everyone! They are you and I at some point in our lives! They
are battling for the well being of their mental health. They have
anxiety that knots up their mind and ties up their gut; and depression
that makes them weak in their knees. They are afraid to face the world
that is often too harsh. They are fading from within trying to fit in.
They’re Anonymous, because some do not want too recognize them. They’re
resting waiting to get back up.
Background Story 3 by Yumeng:
I get the inspiration from my favorite book, the Little Prince. He is
not in that story, and he comes from my imagination.
Each person is composed of abstract geometric figures in that space, and
each person is an independent and unique individual. They have their
planet. Just as each of us is unique in reality, the communication
between people is like the exploration between stars.
I created this character because I believe that people should respect
others' uniqueness while remaining themselves.
Design Process
A lot of fun in redesigning this monster!
First, I got the upper body from Nishra’s drawing and the lower body
from Yumeng’s. I tried to integrate the 2 parts with my monster’s head
in Photoshop and it’s shown below.
New story
It’s a monster.
It’s a lonely monster.
It’s a lonely monster traveling across the universe.
It has a terrifying appearance and the ability to destroy a planet.
It leaps millions of light year but couldn’t meet a single creature.
It is filled with power that cannot be shown to the outside world.
It feels nothing but lonely.
All it can do is to spew up a rainbow.
It is controlled in a micro universe.
It can never escape.
Reflection
The exquisite corpse brings a lot of fun and surprises. Before, drawing is a process of visualizing the image in the mind on a canvas. But this being is a total mystery until you finish the puzzle at the end. Unlike the computer generated random pattern, each piece of it is a part of the creation of a real person. It introduces stories, thoughts, as well as reflections, which make the surreal narrative.
Code
function setup() {
createCanvas(400, 600);
noStroke();
angleMode(DEGREES);
}
function tri(x1, y1, x2, y2, x3, y3, color) {
push();
fill(color);
triangle(x1, y1, x2, y2, x3, y3);
pop();
}
function Eye(x, y) {
push();
fill('#7D0D05');
let tx = map(mouseX, 0, 400, -6, 8, true);
let ty = map(mouseY, 0, 600, -6, 8, true);
translate(tx, ty);
beginShape();
for (let a = 0; a < 360; a += 360 / 6) {
let sx = x + cos(a) * 8;
let sy = y + sin(a) * 8;
vertex(sx, sy);
}
endShape(CLOSE);
stroke('ffffffaF');
strokeWeight(3);
point(x - 2, y - 2);
pop();
}
function Head() {
push();
fill('#231D0F');
rect(136, 110, 70, 50);
fill('#F3CC84');
rect(140, 60, 70, 40);
Eye(150, 77);
Eye(195, 85);
pop();
tri(120, 136, 152, 152, 136, 160, '#35EDA0');
tri(176, 160, 152, 152, 136, 160, '#0DDC6D');
tri(256, 160, 184, 176, 136, 160, '#07BF47');
tri(176, 160, 200, 128, 256, 160, '#1FE47A');
tri(200, 96, 200, 128, 256, 160, '#29EBA5');
tri(200, 96, 264, 104, 256, 160, '#43F1C0');
tri(200, 96, 208, 88, 264, 104, '#47EDBE');
tri(200, 96, 208, 88, 264, 104, '#47EDBE');
tri(264, 88, 208, 88, 264, 104, '#67F0CB');
tri(264, 88, 208, 88, 208, 80, '#47EDBE');
tri(264, 88, 256, 72, 208, 80, '#5CF2E5');
tri(200, 72, 256, 72, 208, 80, '#48F1D9');
tri(200, 72, 256, 72, 240, 48, '#4CF5F5');
tri(200, 72, 224, 32, 240, 48, '#45F3DC');
tri(200, 72, 224, 32, 160, 72, '#33EFBE');
tri(200, 24, 224, 32, 160, 72, '#40F1D7');
tri(200, 24, 168, 32, 160, 72, '#3EEFD2');
tri(144, 40, 168, 32, 160, 72, '#3EF0BD');
tri(144, 40, 152, 64, 160, 72, '#2EEDB6');
tri(144, 40, 152, 64, 128, 64, '#32EC9C');
tri(144, 72, 152, 64, 128, 64, '#2EF0D1');
tri(144, 72, 120, 88, 128, 64, '#2DF0B2');
tri(144, 72, 120, 88, 144, 80, '#30FFBD');
tri(152, 88, 120, 88, 144, 80, '#2BE2B2');
tri(152, 88, 160, 80, 192, 88, '#3BEFC3');
tri(192, 80, 160, 80, 192, 88, '#38EF9B');
tri(192, 80, 160, 80, 160, 72, '#3BFFC5');
tri(192, 80, 200, 72, 160, 72, '#35E6B2');
tri(192, 88, 120, 88, 120, 96, '#24F0B9');
tri(192, 88, 200, 96, 120, 96, '#35EDBC');
tri(112, 128, 200, 96, 120, 96, '#22F091');
tri(112, 128, 200, 96, 120, 136, '#24FF9A');
tri(152, 120, 200, 96, 200, 128, '#45F3A8');
tri(120, 136, 136, 128, 152, 152, '#29E795');
tri(184, 176, 256, 160, 256, 168, '#09810D');
tri(288, 168, 256, 160, 256, 168, '#33A865');
tri(272, 128, 256, 160, 264, 104, '#16DD7D');
tri(264, 88, 272, 104, 264, 104, '#0FC574');
tri(264, 88, 272, 72, 256, 72, '#37EBBF');
tri(240, 48, 264, 48, 256, 72, '#2CF0D6');
tri(240, 48, 240, 24, 224, 32, '#3BF1DE');
tri(136, 128, 152, 128, 152, 120, 'DEF5E5');
tri(152, 120, 200, 128, 160, 128, 'DDF4E2');
tri(136, 128, 152, 144, 152, 152, 'DFECDC');
push();
beginShape();
fill('EDE9D8');
vertex(152, 152);
vertex(166, 140);
vertex(168, 152);
vertex(173, 144);
vertex(176, 160);
endShape();
beginShape();
fill('ECE9D5');
vertex(180, 137);
vertex(190, 136);
vertex(200, 128);
vertex(176, 160);
endShape();
pop();
}
function UpperBody() {
tri(136, 160, 72, 192, 104, 168, '#EFECF5');
tri(136, 160, 72, 192, 152, 168, '#E4E6F2');
tri(136, 160, 184, 176, 152, 168, '#B4C1DE');
tri(200, 216, 184, 176, 152, 168, '#929DB4');
tri(256, 168, 184, 176, 208, 184, '#E6F2E8');
tri(200, 216, 184, 176, 208, 184, '#EBECF1');
tri(200, 216, 256, 168, 208, 184, '#E8F7F0');
tri(200, 216, 256, 168, 288, 168, '#B9D0E3');
tri(200, 216, 304, 200, 288, 168, '#E4EAED');
tri(312, 184, 304, 200, 288, 168, '#DCE9F1');
tri(312, 184, 304, 200, 328, 248, '#809DC9');
tri(312, 184, 328, 200, 328, 248, '#E8E9EB');
tri(360, 304, 328, 200, 328, 248, '#D4E0E9');
tri(280, 272, 304, 200, 328, 248, '#B9CBE1');
tri(280, 272, 304, 200, 272, 240, '#C1DBF3');
tri(200, 216, 304, 200, 272, 240, '#E2E9EF');
tri(272, 240, 280, 272, 200, 216, '#D5E6F3');
tri(288, 320, 280, 272, 200, 216, '#E1EBF2');
tri(288, 320, 168, 240, 200, 216, '#DCE9F1');
tri(160, 208, 152, 168, 200, 216, '#4A5E7B');
tri(160, 208, 152, 168, 72, 192, '#CCCED9');
tri(160, 208, 168, 240, 200, 216, '#50637C');
tri(160, 208, 168, 240, 72, 192, '#E1EAF3');
tri(328, 248, 280, 272, 288, 320, '#BED0E5');
tri(328, 248, 360, 304, 288, 320, '#84B0DF');
tri(72, 192, 168, 240, 56, 216, '#DBE4ED');
tri(128, 240, 168, 240, 56, 216, '#799AC9');
tri(128, 240, 48, 272, 56, 216, '#B0CAE7');
tri(128, 240, 48, 272, 120, 304, '#9AAECB');
tri(56, 304, 48, 272, 120, 304, '#CCDCF0');
tri(168, 240, 128, 240, 288, 320, '#ACCEEE');
tri(120, 304, 128, 240, 288, 320, '#2B62AC');
tri(120, 304, 240, 400, 288, 320, '#367DD5');
tri(120, 304, 240, 400, 168, 408, '#6A9FE0');
tri(120, 304, 144, 408, 168, 408, '#2A62AC');
tri(200, 416, 240, 400, 168, 408, '#557FBA');
tri(200, 416, 240, 400, 256, 408, '#1D284B');
tri(256, 408, 240, 400, 288, 320, '#719DD8');
//right arm
tri(120, 304, 56, 304, 112, 456, '#E8F2F9');
tri(120, 304, 144, 408, 112, 456, '#DAEDF5');
tri(168, 440, 144, 408, 112, 456, '#EAEBED');
tri(168, 440, 136, 480, 112, 456, '#F3F3F5');
tri(168, 440, 136, 480, 168, 472, '#E5E4EA');
tri(168, 440, 176, 448, 168, 472, '#8E949E');
tri(168, 440, 176, 448, 176, 440, '#CFE0ED');
tri(152, 480, 136, 480, 168, 472, '#C5CAD8');
//left arm
tri(288, 320, 256, 408, 296, 432, '#D2E4F2');
tri(288, 320, 360, 304, 296, 432, '#E4ECF9');
tri(224, 432, 256, 408, 296, 432, '#EEEFEE');
tri(224, 432, 224, 456, 296, 432, '#D3D8E4');
tri(224, 456, 280, 480, 296, 432, '#ECEDEE');
tri(224, 456, 280, 480, 256, 480, '#8696A9');
tri(304, 464, 280, 480, 296, 432, '#E7E8EB');
}
function UpperBodyPattern() {
push();
let tx = map(mouseX, 0, 400, -8, 10, true);
let ty = map(mouseY, 0, 600, -5, 5, true);
translate(tx, ty);
blendMode(MULTIPLY);
tri(152, 304, 176, 320, 168, 328, '#25416C');
tri(192, 328, 176, 320, 168, 328, '#33517D');
tri(192, 328, 176, 296, 176, 320, '#233A64');
tri(192, 328, 200, 296, 200, 328, '#1E3662');
tri(240, 304, 200, 328, 216, 328, '#425983');
tri(240, 328, 256, 312, 216, 328, '#2D4770');
tri(240, 328, 240, 336, 264, 328, '#26446C');
tri(240, 328, 240, 336, 216, 328, '#86A3CE');
tri(232, 344, 240, 336, 216, 328, '#7899C6');
tri(232, 344, 240, 336, 256, 350, '#325EA3');
tri(232, 344, 232, 360, 248, 368, '#3F638F');
tri(232, 344, 232, 360, 216, 328, '#84A1CB');
tri(216, 352, 232, 360, 216, 328, '#657EA7');
tri(216, 352, 232, 360, 232, 376, '#2D4465');
tri(216, 328, 216, 352, 200, 344, '#486795');
tri(216, 328, 192, 328, 200, 344, '#2E4B73');
tri(168, 328, 192, 328, 200, 344, '#42659C');
tri(168, 328, 144, 344, 200, 344, '#223A68');
tri(184, 352, 176, 344, 200, 344, '#324E7B');
tri(184, 352, 176, 344, 160, 368, '#224170');
tri(184, 352, 176, 376, 200, 352, '#43618F');
tri(184, 352, 200, 344, 200, 352, '#617EA4');
tri(216, 352, 200, 344, 200, 352, '#6983AD');
tri(208, 360, 216, 352, 200, 352, '#506C93');
tri(200, 376, 200, 352, 208, 360, '#28405F');
tri(208, 360, 216, 352, 216, 376, '#445E80');
pop();
}
function LowerBody1() {
tri(144, 408, 168, 408, 160, 488, '#EFE03E');
tri(200, 416, 168, 408, 160, 488, '#E8D940');
tri(200, 416, 272, 472, 160, 488, '#EED93E');
tri(200, 416, 272, 472, 240, 400, '#E4CE34');
tri(216, 504, 272, 472, 160, 488, '#E4B40D');
tri(216, 504, 192, 504, 160, 488, '#BF9605');
}
let angle = 20;
function LowerBody2() {
push();
let tx = 205,
ty = 496;
translate(tx, ty);
let add = int(millis() / 1000) % 2 ? 1 : -1;
let pa = (millis() / 1000 - int(millis() / 1000));
angle = angle + add * pa;
rotate(angle);
tri(192 - tx, 360 - ty, -120 - tx, 576 - ty, 544 - tx, 520 - ty, '#EDEBF8c8');
strokeWeight(3);
stroke('#3B5093');
tri(6 - tx, 496 - ty, 272 - tx, 536 - ty, 336 - tx, 448 - ty, '#E6ECF364');
strokeWeight(2);
tri(112 - tx, 504 - ty, 285 - tx, 464 - ty, 256 - tx, 520 - ty, '#F0EFF464');
strokeWeight(1);
tri(208 - tx, 488 - ty, 144 - tx, 504 - ty, 256 - tx, 504 - ty, '#F2F2E064');
pop();
}
let rainbow_color = ["#F80000", "#F8A000", "#F8F800", "#007C00", "#0000F8", "#49007E", "#E77EE7"];
function rainbow(num) {
let tx = map(mouseX, 0, 400, -5, 5, true);
let ty = map(mouseY, 0, 600, -400, 0);
let a = int((millis() / 1000 - int(millis() / 1000)) * 10) % 2 ? 1 : -1;
let step = 6;
let jmax = 472 + ty;
push();
fill(rainbow_color[num]);
beginShape();
let x = 146 + num * step + tx;
let y = 128;
for (let j = 0; j < jmax; j += 3) {
let i = j % 2 ? a : -a;
vertex(x + i, y + j);
}
vertex(x + step, y + jmax);
for (let j = 0; j < jmax; j += 3) {
let i = j % 2 ? -a : a;
vertex(x + step + i, y + jmax - j);
}
endShape();
pop();
}
function Slow() {
let num = 50;
while (num--) {
push();
strokeWeight(random(1, 5));
stroke(255, 255, 255, random(50, 205));
point(random(0, 400), random(0, 600));
pop();
}
}
let spew = false;
function draw() {
background('#3B5093');
Slow();
Head();
LowerBody2();
LowerBody1();
UpperBody();
UpperBodyPattern();
if (spew)
for (let i = 0; i < 7; i++)
rainbow(i);
}
function mousePressed() {
spew = !spew
}