weirdie-arsculpture

This is a decorative floating island with a windmill, a bee, and some trees to keep me company in the cold months.

During the winter, all I really want is to be reminded of the fact that the green will come back eventually. I found this floating island model on the Unity asset store, and was inspired to make a little environment based around that. I added a bit of script to a windmill to make it spin, a bee that follows an elliptical path, and a few trees that will be placed upon tapping the screen.

I placed the scene in front of my window so that I could have something else to look at besides snow. There is a relationship between the viewer and the object as both creator and observer.

In the future, I want to try and create an interface with many possible assets so that viewers could "personalize" the island and add different plants and animals to it as they see fit.

weirdie-UnityTutorial

Using instantiate to create new objects with the spacebar (the banana is falling the gif didn't capture that well lol)

Invoke some pineapples

Destroy the pear (spacebar)

go away, radish
(add force with mouse click)

Switch Statements:

look at the radish

weirdie-parrish

I find the idea of coding as exploration very compelling in her talk. Not only applied to poetry or generative text, but as it applies to creative coding in general. Thinking of it as an exploration opens up the world of "happy accidents" where if you are exploration, you might not completely know what it is you're looking for, and I find that exciting. I love her discussion about the creation of "nonsense", and that "what you thought was nonsense was actually sensical all along, you just had to learn how to look at it right." Robots being reporters is also a funny idea - that you are asking a bot or robot to go find things out for you.

weirdie-book

Title: Extraterrestrial

Description: A randomly generated planetary system, some more odd than others.

ZIP file: https://drive.google.com/file/d/1yUczalct7xfK-ImtEHVy2psxaDYRlB W0/view?usp=sharing

Sample Chapter: https://drive.google.com/file/d/1Fiws_jW0sUUF4xBt384MC7pvyvD-mh4f/view?usp=sharing

For the generative text project, I knew that I wanted to create something related to sci-fi, as I've been taking a sci-fi literature class and was inspired by the idea of using generated text and image to explore "the unknown".

As someone who doesn't find writing natural, I began with the image generator. To make the images of the planets, I randomly generated two colors. I then used p5.js' "lerpColor" function to create a gradient between these two that would determine the color palette for each planet. I then used perlin noise to decide the ranges for 3 colors along that gradient. Each planet was also given a random number of moons, and a random radius size. Later on, this became attached to the random moons and radii that the text itself was generating. 

Generating the text itself proved to be a bit frustrating. I first started by generating the name of the planets themselves. The text corpora had a list of planets, and I used wikipedia to find an additional list of minor planets and moons. From these, I randomly generated names for the planets by randomly choosing two names, and splicing random amounts of their characters together. For the name of each system, I simply chose a name from the list.

For the generated text, I used context-free grammar through Rita.js. For each planet, the name, number of moons, moon names, and radius of the planet would be randomly chosen. Then a type of planet (exoplanet, ice planet, terrestrial, etc) would be chosen, and a corresponding climate would be selected. Based on the climate, the habitability and the types of flora and fauna would be selected. Finally, a the generator would choose from a list of possible "other interests" of the planet, such as it being a location that is good for mining, choosing a material from a list from the text corpora of metals.

I would love to revisit this project in the future to dive deeper into the complexity of the generative text. While the results are different from one to the next, they clearly all follow the same structure, which isn't that interesting. I'd be interested to try using Wikipedia's API to potentially use Markov chaining and Rita.js to filter through descriptions of planets from sci-fi novels. I think this project has the potential for something interesting, but it's definitely not there yet.

Code:

Images:

// noprotect
var radius;
var color1;
var color2;
var doRefresh;
var moons;
var axis;
var rings;
var moonNums;
var radii;
var count;
 
function setup() {
 
  createCanvas(800, 800);
  doRefresh = true;
  rings = false;
  moonNums =[
    3,
    2,
    1,
    2,
    3,
    0,
    2,
    2,
    3,
    0,
    1
  ]
 
  radii =[
    66083,
    48507,
    44055,
    44710,
    68424,
    4328,
    46568,
    40628,
    67003,
    23938,
    55680
  ]
  count = -1;
}
 
function draw() {
  if (doRefresh) {
    color1 = color(random(0,255), random(0,255), random(0,255));
    color2 = color(random(0,255), random(0,255), random(0,255));
    moons = moonNums[count];
    noiseSeed(random(0, 9999999));
    radius = map(radii[count], 3000, 70000, 40, 300);
    axis = random(0, PI/3);
    rings = random(0, 1);
    if (rings > 0.9) rings = true;
 
    background(0);
    noStroke();
 
    for (var r = 0; r < height; r ++) {
      for (var c = 0; c < width; c ++) {
        if((sqrt(sq(r-height/2)+sq(c-width/2)) < radius))
        {
        var noiseVal = noise(0.02 * r, 0.02 * c);
        if(noiseVal < 0.25)
        fill(lerpColor(color1, color2, 0.25));
        if(noiseVal < 0.5 && noiseVal > 0.25)
        fill(lerpColor(color1, color2, 0.5));
        if(noiseVal < 1.0 && noiseVal > 0.5)
        fill(lerpColor(color1, color2, 0.75));
        ellipse(r,c,2,2);
        }
        else
        {
          var star = random(0,1);
          if(star < 0.00005)
          {
            fill(255);
            ellipse(r,c,3,3);
          }
        }
      }
    }
 
    for(var m = 0; m < moons; m++)
    {
      fill(lerpColor(color1, color(255), 1/m));
      var rad = random(radius*0.15, radius*0.4);
      var x = random(10, rad*2);
      var y = random(height/2-50, height/2+50);
      if(m % 2 == 0)
      {
        ellipse(width/2-radius-x+20, y, rad, rad);
      }
      else
      {
        ellipse(width/2+radius+x-20, y, rad, rad);
      }
    }
  }
  doRefresh = false;
 
}
 
function keyPressed() {
    saveCanvas('planet' + count, 'png');
}
 
function mousePressed() {
  count++;
  doRefresh = true;
}

Text Generator:

var rg;
var button;
var result;
var x, y;
var moons;
var names;
var Planets = [];
var system;
var size;
var sizes = [];
var moonNums = [];
 
class Planet {
  constructor(name, moonNum, size, description) {
    this.name = name;
    this.moonNum = moonNum;
    this.size = size;
    this.description = description;
  }
}
 
function setup() {
 
  result = "click to generate"
  createCanvas(400, 400);
  background(250);
  x = 100;
  y = 100;
  text(result, x, y, 400, 400);
 
    names = (insert very long list of names here)
  ];
  system = names[floor(random() * names.length)];
 
  rg = new RiGrammar();
  rg.loadFrom('grammar_yay.json', grammarReady);
 
  function grammarReady() {
    console.log('ready');
    // console.log(result);
  }
 
  var myJsonObject = {};
  myJsonObject.system = system;
  myJsonObject.planetarySystem = Planets;
  myJsonObject.sizes = sizes;
  myJsonObject.moonNums = moonNums;
  // Make a button. When you press it, it will save the JSON.
  createButton('SAVE POEMS BUTTON')
    .position(10, 10)
    .mousePressed(function() {
      saveJSON(myJsonObject, 'planetDescriptions.json');
    });
}
 
function mousePressed() {
  var numPlanets = 11;
 
  for (var i = 0; i < numPlanets; i++) {
    var n1 = names[floor(random() * names.length)];
    var n2 = names[floor(random() * names.length)];
    var n3 = names[floor(random() * names.length)];
    var l1 = floor(random(2, n1.length-1));
    var l2 = floor(random(2, n2.length-1));
    var l3 = floor(random(2, n2.length-1));
    var aName = n1.substring(0,l1) + n2.substring(1, l2) + n3.substring(1, l3);
 
    var m = random(0, 1);
 
    var aMoonNum;
    if (m < 0.3) { aMoonNum = 0; } else if (m >= 0.3 && m < 0.6) { aMoonNum = 1; } else if (m >= 0.6 && m < 0.8) {
      aMoonNum = 2;
    } else {
      aMoonNum = 3;
    }
 
    var aMoons = [];
     for (var a = 0; a < aMoonNum; a++) {
      aMoons[a] = names[floor(random() * names.length)];
    }
    var diameter = floor(random(2000, 70000));
    var aDescription = "";
    newPlanet();
    if(i == 0)
    {
      aDescription = aName + " is the 1st planet in the " + system + " System. It has ";
    }
    else if(i == 1)
    {
      aDescription = aName + " is the 2nd planet in the " + system + " System. It has ";
    }
    else if(i == 2)
    {
      aDescription = aName + " is the 3rd planet in the " + system + " System. It has ";
    }
    else
    {
      aDescription = aName + " is the " + (i+1) + "th planet in the " + system + " System. It has ";
    }
 
    if(aMoonNum == 0)
    {
      aDescription = aDescription + "no moons. ";
    }
    else if(aMoonNum == 1)
    {
      aDescription = aDescription + aMoonNum + " moon, which is called " + aMoons[0] + ". ";
    }
    else if(aMoonNum == 2)
    {
      aDescription = aDescription + aMoonNum + " moons, which are named " + aMoons[0] + " and " + aMoons[1] + ". ";
    }
    else if(aMoonNum == 3)
    {
      aDescription = aDescription + aMoonNum + " moons, which are named " + aMoons[0] + ", " + aMoons[1] + ", and " + aMoons[2] + ". ";
    }
 
    size = floor(random(3000, 70000));
 
    aDescription = aDescription + "It has a radius of " + size + " kilometers. ";
 
    aDescription = aDescription + aName + " is " + result;
 
    var aPlanet = new Planet(aName, aMoonNum, size, aDescription);
    Planets[i] = aPlanet;
 
    sizes[i] = size;
    moonNums[i] = aMoonNum;
  }
 
}
 
function newPlanet() {
 
  result = rg.expand();
  result = result.replace(/% /g, '\n');
  console.log("\n" + result);
  drawPlanet();
}
 
function drawPlanet() {
 
  background(250);
  text(result, x, y, 200, 200);
 
}

Grammar.js file:

{
  "": [
    ""
    ],
  "": [
    ""
    ],
  "" : [
    "",
    "The planet's  deposits make it the location of a valuable mining colony.",
    "",
    "The planet is a popular tourist desination in the solar system.",
    "",
    "Attempts have been made to begin terraforming here.",
    "It has the potential for colonization in the future.",
    "",
    "It is unlikely humans will ever visit."
    ],
  "" : [
    "",
    "",
    "",
    ""
    ],
  "" : [
    "Due to the high amount of  in the atmosphere, nothing can survive. ",
    "Although beautiful, is incapable of sustaining life. ",
    "It is incapable of sustaining life. ",
    "No life has been found. ",
    "There is little chance of life. ",
    "There is no chance of life. "
  ],
  "" : [
    "frigid temperatures",
    "freezing temperatures",
    "constant snowstorms",
    "constant blizzards",
    "constant hail"
  ],
  "" : [
    "Its proximity to the sun and thin atmosphere cause the heat to be almost unbearable. ",
    "The planet is known for its constant violent sandstorms. "
    ],
  "" : [
    "The surface is covered with boiling lava. "
  ],
  "" : [
    "There is very little life here. The climate mainly consists of <1>, and as such only small shrubs and trees are able to grow. ",
    "There is very little life here. The climate is entirely <1H>, and as such life here consists mainly of shrubs and small mammals. "
  ],
  "": [
    "There is some life here. The planet is mainly covered with <2>, with a variety of , , and . "
  ],
  "" : [
    "There is an abundance of life here. It is known for its <3>, which are home to many types of  and . "
  ],
  "" : [
    "birds",
    "bats",
    "small animals",
    "butterflies",
    "mammals",
    "reptiles",
    "insects",
    "arachnids"
    ],
  "" : [
    "trees",
    "flowers",
    "mosses",
    "plants"
    ],
  "" : [
    ],
  "" : [
    " It is also home to -like aliens who , and are known for being ,  creatures. ",
    " It is also home to -like aliens who , and are known for being ,  creatures. ",
    " It is also home to -like aliens who , and are known for being ,  creatures. "
  ],
  "" : [
    "are highly intelligent and advanced",
    "are pretty stupid",
    "have only begun to develop tools"
    ],
  "<1>" : [
    "tundras",
    "dry deserts",
    "hot deserts",
    "semiarid deserts"
    ],
  "<1H>" : [
     "dry deserts",
    "deserts",
    "semiarid deserts"
    ],
  "<2>" : [
    "savannas",
    "forests"
    ],
  "<3>" : [
     "tropical forests",
     "deciduous forests",
     "tropical regions",
      "forests",
     "swamps"
    ],
  "" : [
    "The waters here house numerous species of plants and animals, both large and small. ",
    "Here, the fauna include many species of fish and some mammals, such as whales and dolphins. Much of the sea life here feeds on the abundant plankton. ",
    "Flora are represented primarily by seaweed while the fauna, since it is very nutrient-rich, include all sorts of bacteria, fungi, sponges, sea anemones, worms, sea stars, and fishes. ",
    "Chemosynthetic bacteria thrive near these vents because of the large amounts of hydrogen sulfide and other minerals they emit. These bacteria are thus the start of the food web as they are eaten by invertebrates and fishes. "
    ],
  "" : [
    "a chthonian planet. ",
    "a carbon planet. ",
    "a coreless planet. ",
    "a gas dwarf. ",
    "a helium planet. ",
    "an ice giant. The  make it uninhabitable.",
    "an ice planet. The climate is exlusively tundra, and it is known for its . ",
    "an iron planet. ",
    "a puffy planet. ",
    "a silicate planet. ",
    "a terrestrial planet. ",
    "a gas giant. ",
    "a giant. ",
    "an exoplanet. ",
    "a lava planet. ",
    "a mesoplanet. ",
    "a telluric planet. ",
    "a rocky planet. ",
    "a protoplanet.",
    "an ocean planet. ",
    "a desert planet. The climate is mostly <1H>, with little life other than the  which call it home."
    ],
  "" : [
    "cacti",
    "shrubs",
    "spiders",
    "scorpions",
    "moths",
    "herbs",
    "small trees",
    "bushes"
    ],
	"" (insert list of poisons here)
  "" (insert long list of animals here)

 

lass-weirdie-justaline

lass and weirdie created a "friending machine" that dispenses both candy and new friends.

This project would be an AR installation using a series of vending machines. Viewers would be able to see small characters waving at them from inside as they passed by. They would be able to operate the vending machine using special coins that the vending machine would be able to pick up, and the machine would dispense a "friend".

 

weirdie-LookingOutwards04

Type Case

Type Case is a piece by Martin Bircher which uses 125 rectangular "pixels" that are created by setting an LED light in every section of a type case which was used to store letters for a printing press. Close up, it is impossible to tell that the lights turning on and off are showing anything more than random noise, but from a far distance viewers can see that the lights are actually forming text which is from recent headlines.

What I really enjoy about this piece is the necessity for it to be a physical work as it would not have anywhere near the same effect if it were to be, say, a program on a computer screen. It requires a certain degree attention and interactivity from the viewer. The idea of our ability to perceive or process an event based on our distance from it is a compelling one.

One thing I wonder is whether or not most people would be able to recognize the box as a type case, or be able to recognize that the words are headlines and not simply random text. It would be exciting if the headlines were updating in real-time as well. Bircher has also used Type Case to display images as well, but due to the limited pixels I don't find this to be as compelling.

Type Case from Martin Bircher on Vimeo.

weirdie-Body

Interactive Shadow Box

I knew for this project that I wanted to create something that specifically responded to the face. I was interested in how the movement of the face could be translated to control something non-human, such as a butterfly. For this reason I chose to use FaceOSC, as I wanted to utilize the gestures such as head tilt and eye openness to control movement. The goal was to create a sort of interactive shadow box, where the image appears still until it detects a face. I would be interested in creating a whole display set of them in the future with other insects and other control gestures. The wings were drawn in Photoshop, created as two separate images which are rotated about the y-axis based on how open your eyes are.

After being frustrated with how jittery the movement appeared, I utilized a circular buffer that takes a running average of previous points to translate to the actual movement of the butterfly. This helped significantly, though it could certainly be refined further. Additionally, I would like to add a cast shadow from the butterfly to add depth.

GIF of some normal blinking:

GIF with really aggressive squinting:

Still image of just the shadow box:

import oscP5.*;
OscP5 oscP5;
 
int     found; // global variable, indicates if a face is found
PVector poseOrientation = new PVector(); // stores an (x,y,z)
float leftOpen;
float rightOpen;
PImage wingRight;
PImage wingLeft;
PImage bckgrd;
CircularBuffer leftBuff = new CircularBuffer(10);
CircularBuffer rightBuff = new CircularBuffer(10);
 
 
//----------------------------------
void setup() {
  size(800, 800, OPENGL);
  oscP5 = new OscP5(this, 8338);
  oscP5.plug(this, "found", "/found");
  oscP5.plug(this, "poseOrientation", "/pose/orientation");
  oscP5.plug(this, "leftOpen", "/gesture/eye/left");
  oscP5.plug(this, "rightOpen", "/gesture/eye/right");
  oscP5.plug(this, "leftBrow", "/gesture/eyebrow/left");
  oscP5.plug(this, "rightBrow", "/gesture/eyebrow/right");
 
  wingRight = loadImage("wingr.png");
  wingLeft = loadImage("wingl.png");
  bckgrd = loadImage("background.png");
}
 
//----------------------------------
void draw() {
  background (214, 205, 197);
  background(178, 163, 149);
  image(bckgrd, 0, 0, width, height);
 
  noFill();
  float scl = 250;
 
  if (found != 0) {
    pushMatrix(); 
    translate (width/2, height/2, 0);
    rotateZ (poseOrientation.z);
    float rightRotate = filter(rightBuff);
    rotateY (constrain(map(rightRotate, 2.7, 3.7, -PI/2, PI/6), -PI/2+0.1, -0.05)); 
    image(wingRight, 0, -200, scl, 1.4*scl);
    popMatrix();
 
    pushMatrix();
    translate (width/2, height/2, 0);
    rotateZ (poseOrientation.z);
    float leftRotate = filter(leftBuff);
    rotateY (constrain(map(leftRotate, 2.7, 3.7, PI/2, -PI/6), 0.05, PI/2-0.1));
    image(wingLeft, 0, -200, -scl, 1.4*scl);
    popMatrix();
  }
  else
  {
    pushMatrix();
    translate (width/2, height/2, 0);
    image(wingRight, 0, -200, scl, 1.4*scl);
    image(wingLeft, 0, -200, -scl, 1.4*scl);
    popMatrix();
  }
 
  fill(37, 34, 27);
  noStroke();
  rect(0, 0, width, 30);
  rect(0, 0, 30, height);
  rect(0, height-30, width, 30);
  rect(width-30, 0, 30, height);
}
 
//----------------------------------
// Event handlers for receiving FaceOSC data
public void found (int i) { found = i; }
public void poseOrientation(float x, float y, float z) {
  poseOrientation.set(x, y, z);
}
public void leftOpen (float i) {leftOpen = i; leftBuff.store(i);}
public void rightOpen (float i) {rightOpen = i; rightBuff.store(i);}
 
//----------------------------------
// Event handlers for receiving FaceOSC data
public void found (int i) { found = i; }
public void poseOrientation(float x, float y, float z) {
  poseOrientation.set(x, y, z);
}
public void leftOpen (float i) {leftOpen = i; leftBuff.store(i);}
public void rightOpen (float i) {rightOpen = i; rightBuff.store(i);}
public float filter (CircularBuffer buff)
{
  float filt = 0;
  for (int i = 0; i < buff.data.length; i++)
  {
    filt = filt + buff.data[i];
  }
  return filt/buff.data.length;
}
 
//----------------------------------
//CIRCULAR BUFFER CLASS -- keeps past datapoints and calculates average
//to help with smoothing the movement
public class CircularBuffer {
    public float[] data = null;
 
    private int capacity  = 0;
    private int writePos  = 0;
    private int available = 0;
 
    public CircularBuffer(int capacity) {
        this.capacity = capacity;
        this.data = new float[capacity];
    }
 
    public void reset() {
        this.writePos = 0;
        this.available = 0;
    }
 
    public int capacity() { return this.capacity; }
    public int available(){ return this.available; }
 
    public int remainingCapacity() {
        return this.capacity - this.available;
    }
 
    public void store(float element){
 
 
            if(writePos >= capacity){
                writePos = 0;
            }
            data[writePos] = element;
            writePos++;
            available++;
    }
}

weirdie-LookingOutwards03

This is an interactive installation work by Camille Utterback from 2013 entitled Flourish. It is a series of 7 glass panels, each with 2 layers, and 3 of which are interactive. The combination of colors and textures creates a sense of depth which is heightened by lights that respond to viewers' movements and travel between the panels. I'm inspired by the combination of materials and ideas in this piece. Painting, sculpture, interactivity, time-based media, and glass-work are all being combined to create what I see as a living painting with an incredible sense of depth. It's hard to know without seeing the piece in person, but I wish all of the panels were interactive, though perhaps it is more surprising if only a few are.  I think the image of the tree is a bit cliche, and that the more abstract but still very natural elements of the rest of the panels are much more compelling. The idea of creating interactive paintings that change over time is one that is exciting to me, particularly coming from a painting background myself.

 

 

weirdie-viewing04

Spectacle is when a medium is used to show off the latest software, often by large companies and in advertising.

Speculation focuses not on craft, but on the relationship between technology and art-making, often in a way that is meant not to be visually appealing but conceptually interesting.

The project A Hole in Space is one that I think could be argued as both spectacle and speculation, and for that reason I view it as sitting somewhere in the middle. It absolutely has elements of being a spectacle - it is showing off new, grand technology in capturing and broadcasting video in a way that is meant to be technically amazing to the viewer. However, it also has elements of speculation, where it is commenting on growing technology's ability to impart a sense of togetherness and to make the world a little smaller. This is something less about the technically impressive aspect of the project and more about what it is "about" conceptually.

This piece falls very strongly towards technological acceleration in acceleration vs drag, as it promotes a future with increased telecommunication capabilities. Clearly it is more about visibility rather than invisibility, particularly in the aspect that viewers cannot see themselves on the screens, as with a typical video-chat, but can only see the other city. I would argue this piece leans more towards surplus rather than waste, as it is more emphasizing the positives of the development of technology. Finally, I think this piece is exclusively in the category of art rather than commerce, as it was done unannounced with no brand, advertisement, or promotion of any kind attached to it.