Generative Animation: A Clock for Aliens

Brief

Create an animation that shows a clock for aliens. The clock cannot display time tied to the rotation of the Earth - years, months, days, hours, minutes, etc. Instead create your own system of time - however large or small. If the clock is no longer tied to celestial movement - how else can you express the passing of time? Would the time be continuous or discrete? Cyclical or unidirectional? How would you divide it into sub-elements and what visual tools would you use to represent distinctions: color, shape, size, order?

  • use arrays and loops

  • use rotation with the transformation matrix

  • use either trigonometric functions or intervals (or both if need be)

Ideation

When I was told that we were designing a clock for aliens, my brain stopped working. I don’t even like aliens, they scare me, and I don’t want to know what they look like or what they want.

But here I am, designing a clock for aliens.

Since the brief says that we can’t use time tied to the rotation of the earth, first I was thinking about just trying not to see time connected to numbers as much as possible - it should be something just passing no matter what until we all die at the end.

First Phase

Here are some of the ideation sketches that I designed during the workshop:

Initially, my first ideas were basically like this:

  1. There is no sense of time that they can describe with numbers, but they do know that time is passing

    • it can be something that starts with a big chunk of something (any shape can work)

    • as they live and approach to death, smaller chunk will fall apart from the big one

    • big one gets shrink as they produce small chunks

    • when the big one has no longer has any left to produce small chunks, it disappear - a.k.a. death.

  2. Still, there is no sense of time, but for this idea the big chunk will be called lifeMama, and small chunks will be called lifeEvents that is coming from interaction with people. Once the canvas has X amounts of lifeEvents, lifeMama explodes - again, a.k.a. death. Then it starts getting bigger again, meaning they are in next life.

    • depending on the type of interaction, the size of lifeEvents changes

      • bad interaction = larger chunks will be falling apart because this kind of interaction will stress out the aliens

      • good interaction = smaller chunks will be falling apart because aliens are happy (even though they are still approaching to death)

    • when lifeMama is getting smaller, the color changes to darker shade because lifeMama is sad that it’s getting closer to die

    • when lifeMama is getting bigger (after reborn), the color changes to lighter share because lifeMama is excited to have another life

After the first phase at the workshop, I designed this:

As you can see, the small chunks kept being produced and it was visually and mentally hurting me. Although I like the idea of lifeEvents and lifeMama, I decided not to go for this. Instead, I wanted to design something more unique, visually pleasing, and alien-friendly.

Second Phase

After I failed at my first idea, I did additional research to get more inspiration. Then I found this cool design on OpenProcessing.

In this design, it starts from one circle and then revolves into multiple circles until it gets back to the previous shape. Once it finally ends one round of revolving, it still keeps going and start new round which I found very interesting.

This design reminded me of circle of life, so I started thinking how I could implement this design to this project. At this point, there were a couple things in my mind that I wanted to going for:

  1. Revolving Circles: this is going to show circle of life, starting from when it’s born to death, and reborn

  2. Pulsing Circles: this would be translated as a power of life, representing life itself (even though I don’t know if aliens even have a heart to pulse)

  3. Obstacle: this is going to be something that would interfere our life, a.k.a. an outlander

To create a pulsing circles, I designed this by using loop:

Final Design

After the research and designing on the second phase, I basically combined the code for Revolving Circles and Pulsing Circles, make some adjustment for both to make it look blended and natural. Last but not least, I added a polygon rotating to the opposite way in the center of the canvas to express the “outlander.”

Here’s the video of the final design:

Takeaway

Although I’m not a big fan of aliens, I ended up having fun seeking for ideas for their time system. I can’t say I’m 100% satisfied just because there are some lines that I still don’t fully understand how it’s even working. I’m usually a type of person who’s convinced that “if it works, it works,” but this project really challenge me to actually figure everything out until I finally burn my brain off.


Code

Here’ s my final code, or you can check it at my OpenProcessing page!

//uwu
//Revolving circles were based on Atsushi Tadokoro's Circle Motion 04
//https://openprocessing.org/sketch/1964091

int numRings = 8; // Number of concentric rings
float[] ringSpeeds = new float[numRings]; // Speed of rotation for each ring
color[] ringColors = new color[numRings]; // Colors for each ring
float[] ringRadii; // Radii for each ring
float[] ringPulseSpeeds = new float[numRings]; // Speed of pulsation for each ring
float[] ringBaseRadii; // Base radii for each ring

int numCircles = 16; // Number of revolving circles
PVector[] circlePos = new PVector[numCircles]; // Circle positions
float radius; // Orbit radius
float velocity; // Angular velocity

color bgColor; // Background color

float polyRadius; // Radius of the rotating polygon
int polySides = 7; // Number of polygon sides
float polyRotationSpeed = -radians(1); // Opposite direction rotation
float polyRotationAngle = 0; // Current angle of polygon rotation

void setup() {
  size(800, 800);
  noFill();
  
  // Initialize ring speeds, colors, radii, and pulsation speeds
  for (int i = 0; i < numRings; i++) {
    ringSpeeds[i] = random(0.01, 0.1); // Random rotation speeds
    ringColors[i] = color(random(255), random(255), random(255)); // Random colors
    ringPulseSpeeds[i] = random(0.01, 0.1); // Random pulsation speeds
  }
  
  ringRadii = new float[numRings];
  ringBaseRadii = new float[numRings];
  float spacing = 30; // Spacing between rings
  float startRadius = 50; // Starting radius
  for (int i = 0; i < numRings; i++) {
    ringBaseRadii[i] = startRadius + i * spacing;
    ringRadii[i] = ringBaseRadii[i];
  }
  strokeWeight(1.5); // Set the stroke weight for all rings

  // Initialize circle positions
  radius = height / 4.0;
  velocity = 2.0;
  for (int i = 0; i < numCircles; i++) {
    circlePos[i] = new PVector(0, 0);
  }

  // Set solid background color
  bgColor = color(5, 28, 52);

  // Initialize polygon parameters
  polyRadius = 100;
}

void draw() {
  background(bgColor); // Set the background color
  
  translate(width / 2, height / 2);
  
  // Draw the rotating polygon
  pushMatrix();
  translate(0, 0);
  rotate(polyRotationAngle);
  stroke(10, 102, 198); // Polygon color
  beginShape();
  for (int i = 0; i < polySides; i++) {
    float x = cos(radians(i * 360 / polySides)) * polyRadius;
    float y = sin(radians(i * 360 / polySides)) * polyRadius;
    vertex(x, y);
  }
  endShape(CLOSE);
  popMatrix();
  
  // Update polygon rotation angle
  polyRotationAngle += polyRotationSpeed;

  // Draw the concentric rings with pulsation
  for (int i = 0; i < numRings; i++) {
    float rotationAngle = radians(frameCount * ringSpeeds[i]);
    pushMatrix();
    rotate(rotationAngle);
    stroke(ringColors[i]);
    
    // Calculate the pulsating radius
    ringRadii[i] = ringBaseRadii[i] + sin(frameCount * ringPulseSpeeds[i]) * 20.0; // Adjust pulsation factor as needed
    
    float ringRadius = ringRadii[i];
    ellipse(0, 0, ringRadius * 2, ringRadius * 2);
    popMatrix();
  }

  // Update ring colors gradually
  for (int i = 0; i < numRings; i++) {
    ringColors[i] = lerpColor(ringColors[i], color(random(255), random(255), random(255)), 0.005);
  }

  // Draw the revolving circles
  for (int i = 0; i < numCircles; i++) {
    float curRadius = map(i, 0, numCircles - 1, width / 100.0, width / 4.0);
    float curVel = velocity / numCircles * (i + 1);
    PVector curPos = circlePos[i];
    curPos.x = cos(radians(frameCount) * curVel) * radius;
    curPos.y = sin(radians(frameCount) * curVel) * radius;
    ellipse(curPos.x, curPos.y, curRadius * 2, curRadius * 2);
  }
}
Previous
Previous

Interactive Simulation: Urban System

Next
Next

Mircointeractions reading: Rules, Feedback and Modes