Monica Chang – Looking Outwards 12 – Project Priors and Precursors

For this final project, I want to utilize the generative landscape and sound to create an imaginative, colorful world. There are many artists who I will be thinking about over the course of developing this project but there are two that will be prioritized.

One of these artists is Maxim Zhestov who is a media artist who concentrates on film, installation and computational design to stretch the boundaries of visual language. He is famous for his digitally-rendered gallery designs which produce choreographed and calculated movements of elements and shapes using physics and computers.

Computations, Maxim Zhestov

Another one of the artists I would like to explore further along this final project is Mike Tucker who is an interactive designer and director who focuses on audio-visual exploration who co-created the app, Tónandi, which had a feature of a VR experience of a fantasy-like landscape.

A peak into the virtual app created by MagicLeap, Tónandi.

Although Mike Tucker was able to create an environment that was able to interact with his audience, I felt Maxim Zhestov’s piece would have also been more interesting if the audience was able to interact with the visuals as well although fully computer-generated. However, both beautifully generate a new, fantastical world that fascinates me the most.

Charmaine Qiu – Project 12- Final Project Proposal


What the interface might look like

The idea of customization has always been a favorite for people who want to create or own things that are authentic to themselves. For the final project, I want to create a game that allows users to experiment possibilities and create a desert item (cake, drink, or ice cream?) of their own. The main features of the desert would be hand drawn by me on Procreate/Illustrator, and imported to the sketch file. Other features can allow some sort of randomization, such as the sizing and color of small decorations. While decorating the desert, the users could choose the factor that they want, and visualize it by interacting with the keyboard/mousepad. Even though I have not completely settled on the type of desert that I want to create for the project, the project itself will be fun to create with the objective of giving the players a stress relieving experience.

Charmaine Qiu – Looking Outwards 12


Let’s Create! Pottery example

Zepeto Characters

For the final project, I want to create a decorating game that allows users to create something of their own. In the past, customization/decorating games constantly appeared in people of all ages’ interests. I remember playing “Let’s create! Pottery” and discovering the endless possibilities of decorating ceramics. The game was released in 2010, and published by Infinite Dreams. Through the game, people can design realistic potteries with their own desired features. On the other hand, “Zepeto” , an application that allows users to create a 3D avatar of themselves has been very popular during the past year. The app was published by Snow Corporation, and it also have socializing functions that let users to meet others with the avatar they created. The idea of creating something that is one of a kind really interest me, and I hope to create a game that could invite users to discover their own creativity.

Claire Yoon- Project 12

For my final project I want to create a game where the user is stacking different types of cakes on top of each other. The cakes will be placed in random places on the screen as it is moving up (towards the sky) and the user will drag the cakes towards the center and start stacking them. The user is given a choice to pick what type of cakes to stack to create their own ultimate multi layered customized cake. However, if the dragged piece is offset by more than half of the length of the cake then the whole thing will topple over.

Sammie Kim – Looking Outwards – 12

Generative Album cover design by Kostya Ostroukhov and Color Wander by Matt Deslauriers are two projects that deeply inspired me. Kostya Ostroukhov is a graphic designer from Russia; his Generative Album cover project utilizes JavaScript, and the graphics float around that match the mood and style of Imagine Dragons. The idea of a dynamic album cover immediately fascinated me, as it could express the unique aesthetics of the music for a brief moment unlike a music video. On the other hand, Matt Deslauriers is a generative artist and creative coder from Canada. Color Wander is an open source generative artwork that allows users to interact with the screen to produce fascinating textures and patterns come alive. 

I personally feel that both projects could have merged to produce a more adaptable and versatile artwork. Ostroukhov lacks the complexity and interactive element that is evident in Deslauriers’s generative art piece, whereas Deslauriers lacks the purposefulness and entertainment aspect. Yet, I admire each one as I am very intrigued in producing beautiful visual elements that connect with and respond to the user.

Color Wander by Matt Deslauriers
Generative Album cover design by Kostya Ostroukhov

Link to Matt Deslauriers’s website: https://www.mattdesl.com

Link to Kostya Ostroukhov’s works: https://www.behance.net/gallery/76084379/Album-covers-with-generative-design

Katrina Hu – Project 11 – Generative Landscape

sketch_project11

/*Katrina Hu
15104-C
kfh@andrew.cmu.edu
Project-11*/

var x1 = 100;
var x2 = 400;
var x3 = 30;
var luggage = [];

function setup() {
    createCanvas(480, 480);
    frameRate(60);
    background(191, 233, 255);

    //set an initial group of luggage
    for (var i = 0; i < 5; i++) {
    	var rx = random(width);
    	luggage[i] = makeLuggage(rx)
    }
}

function draw() {
	//drawing sun
	noStroke();
	fill(255, 252, 227);
	ellipse(80, 40, 80, 80);
	fill(255, 246, 179);
	ellipse(80, 40, 70, 70);
	fill(255, 238, 112);
	ellipse(80, 40, 50, 50);

	//drawing clouds
	drawCloud(x1);
	drawCloud(x2);
	drawCloud(x3);

	//drawing floor & window
	fill(100);
	rect(97, 0, 10, height);
	rect(377, 0, 10, height);
	rect(0, 67, width, 10);
	rect(0, 294, width, 180);
	fill(184);
	rect(0, 300, width, 180);
	rect(100, 0, 10, height);
	rect(380, 0, 10, height);
	rect(0, 70, width, 10);

	//drawing conveyor belt
	fill(50);
	rect(0, 372, width, 10);
	fill(110);
	rect(0, 380, width, 50)
	fill(200);
	rect(0, 390, width, 30)
	for(var dots = 0; dots < 9; dots ++) {
		fill(110);
		ellipse(dots * 70 + 20, 408, 10, 10);
		fill(250);
		ellipse(dots * 70 + 20, 403, 10, 10);
	}

	//drawing luggage
    updateLuggage();
    removeLuggageFromView();
    addLuggage();
}

function drawCloud(x) {
    push();
    noStroke();
    fill(240);
    ellipse(x, height / 5, 100, 100);
    ellipse(x + 10, height / 5 + 5, 100, 100);
    ellipse(x + 80, height / 5, 80, 70);
    ellipse(x + 10, height / 5 - 10, 80, 80);
    ellipse(x + 70, height / 4 - 55, 60, 50);
    pop();
}


function updateLuggage() {
    for (var i = 0; i < luggage.length; i++) {
        luggage[i].move();
        luggage[i].display();
    }
}

function removeLuggageFromView() {
    //remove luggage from array if it's out of sight
    var luggageToKeep = [];
    for (var i = 0; i < luggage.length; i++) {
        if (luggage[i].x + luggage[i].breadth > 0) {
            luggageToKeep.push(luggage[i]);
        }
    }
    luggage = luggageToKeep; //remember the surviving luggage
}

function addLuggage() {
    //with a very small probability, add a new luggage to the end
    var newLuggageProb = 0.005; 
    if (random(0,1) < newLuggageProb) {
        luggage.push(makeLuggage(width));
    }
}

function luggageDisplay() {
	var top = 375 + this.height;
	//draw luggage
	stroke(0);
    fill(this.r, this.g, this.b);
    rect(this.x, 380, this.breadth, this.height);
    //draw handle
    fill(50);
    rect(this.x + 20, top, this.breadth - 45, 4);
    rect(this.x + 20, top, 4, 10);
    rect(this.x + this.breadth - 25, top, 4, 10);



}

function luggageMove(){
    this.x += this.speed; 
}

function makeLuggage(startX){
    var myLuggage = {x: startX,
                speed: -1.0,        
                breadth: random(80, 120),
                height: -random(50, 80),
                r: random(100, 255),
                g: random(100, 255),
                b: random(100, 255),
                move: luggageMove,
                display: luggageDisplay}
    return myLuggage;
}

My project is of a luggage conveyor belt in an airport. I decided to choose this landscape because of the picture that was posted within the instructions, which showed luggage moving around the belt. Luggage size and color is randomly picked and drawn onto the conveyor belt. This was a very fun project to do, and it was a great opportunity for me to practice using objects. The part I struggled with the most was figuring out how to draw the luggage handles on top of the suitcases. But overall, I learned a lot and am very happy with how the project turned out.

My original sketch of the project

Shariq M. Shah – Project 11 – Generative Landscape


shariqs-project-11

// Name: Shariq M. Shah
// Andrew ID: shariqs
// Section: C
// Project 11

//initializing objects as empty arrays
var boxes = [];
var balls = [];

var spikesSpeed = 0.0005;
var spikesDetail = 0.5;

function setup() {
    createCanvas(640, 240);
    // creating boxes
    for (var i = 0; i < 10; i++){
        var rx = random(width);
        boxes[i] = makebox(rx);
    }
    frameRate(30);
}
function draw() {
    background(235, 183, 52);
    noFill();
    stroke(1);
    beginShape();
    for (var x = 0; x < width; x++) {
      var t = (x * spikesDetail * 2) + (millis() * 1.3 * spikesSpeed);
      var y = map(noise(t), 0, 1, 0, height);
      vertex(x, y);
      push();
      fill(0);
      ellipse(x, y, 5, 5);
      pop();
    }
    endShape();
    updateAndshowboxes();
    removeboxesThatHaveSlippedOutOfView();
    addNewboxesWithSomeRandomProbability();
    //text that moves in generative landscape
    text("//wishyouwerehere", constrain(mouseX, 50, width - 100), height/2 + 50, 5)
}
function updateAndshowboxes(){
    // Update the box's positions, and show them.
    for (var i = 0; i < boxes.length; i++){
        boxes[i].move();
        boxes[i].show();
    }
}
function removeboxesThatHaveSlippedOutOfView(){
    var boxesToKeep = [];
    for (var i = 0; i < boxes.length; i++){
        if (boxes[i].x + boxes[i].breadth > 0) {
            boxesToKeep.push(boxes[i]);
        }
    }
    boxes = boxesToKeep; // remember the surviving boxes
}
function addNewboxesWithSomeRandomProbability() {
    // With a very tiny probability, add a new box to the end.
    var newboxLikelihood = 0.007;
    if (random(0,1) < newboxLikelihood) {
        boxes.push(makebox(width));
    }
}
// method to update position of box every frame
function boxMove() {
    this.x += this.speed;
}
function boxshow() {
    var heightUp = 20;
    var bHeight = this.nFloors * heightUp;
    fill(0);
    stroke(5);
    push();
    translate(this.x, height - 40);
    noStroke();
    for (var i = 0; i < 50; i++) {
        rect(5, -15 - (i * heightUp), this.breadth - 5, 1 + i);
        ellipse(-20, -(i * 1.2 * 2 * heightUp), 5 + i, 5 + i);
    }
    pop();
}
function makebox(birthLocationX) {
    var bldg = {x: birthLocationX,
                breadth: 50,
                speed: -1.0,
                nFloors: round(random(2,8)),
                move: boxMove,
                show: boxshow}
    return bldg;
}

In this project, I used objects to generate an abstract and dynamic landscape that interacts with the rectangular geometry objects in the background. The arrays and dynamic objects generate a constantly moving and energetic field.

Shannon Ha – Project 11 – Generative Landscape

sketch

//Shannon Ha
//Section D
//sha2@andrew.cmu.edu
//Project 11 Generative Landscape

var terrainSpeed = 0.0001;
var terrainDetail = 0.006;
var martians = [];

function setup() {
    createCanvas(480, 300);

    for (var i = 0; i < 4; i++){ //create initial collection of martians displayed on screen.
        var rx = random(width);
        martians[i] = makeMartian(rx);
    }
    
    for (var i = 0; i < stars; i++) { //randomly generates star size and position.
    sX.push(random(0, width)); // x position of star
    sY.push(random(0, height / 3)); // y position of star
    starSize.push(random(0.1, 1)); // star size
    }
    frameRate(15);
}

function draw() { // calls all the objects
    background(43, 14, 7);
    drawStars();
    drawMountain();
    drawMountainB();

    //calls martian objects
    updateAndDisplayMartians();
    removeMartians();
    addMartians();

    // draw distant planet A
    fill(130, 67, 52);
    noStroke();
    ellipse(400, 20, 30, 30);
    // draw distant planet B
    fill(176, 91, 70);
    ellipse(350, 15, 10, 10);
}
var stars = 300; //number of star points
var sX = []; //x position array
var sY = []; //y position array
var starSize = [];// star size array

function drawStars() {
    noStroke();
    for (var i = 0; i < stars; i++) { // draws the stars
        stroke(random(100, 255)); // randomize grayscale for stroke to give the twinkle effect
        strokeWeight(starSize[i]);
        point(sX[i], sY[i], 10, 10);
    }
}

function drawMountain(){ //background terrain
    push();
    fill(79, 16, 0);
    noStroke();
    beginShape();
    vertex(0, height);
    for (var x = 0; x < width; x++) {
        var t = (x * terrainDetail) + (millis() * terrainSpeed);// adjusts flatness of terrain
        var y = map(noise(t), 0,1, height/2.5, height * 0.2);
        vertex(x, y);
    }
    vertex(width, height);
    endShape();
    pop();
}

function drawMountainB(){ //terrain in the front
    push();
    fill(138, 31, 4);
    noStroke();
    beginShape();
    vertex(0, height);
    for (var x = 0; x < width; x++) {
        var t = (x * terrainDetail) + (millis() * terrainSpeed * 2);
        var y = map(noise(t), 0,1, height , height * 0.1);
        vertex(x, y);
    }
    vertex(width, height);
    endShape();
    pop();
}

function updateAndDisplayMartians(){
    // Update the martians' positions, and display them
    for (var i = 0; i < martians.length; i++){
        martians[i].move();
        martians[i].display();
    }
}

function removeMartians(){ // removes all martians that go off the canvas.
    var martiansToKeep = [];
    for (var i = 0; i < martians.length; i++){
        if (martians[i].x + martians[i].breadth > 0) {
            martiansToKeep.push(martians[i]);
        }
    }
    martians = martiansToKeep; // remembers the remaining martians on canvas.
}

function addMartians(){ // adds new martians onto canvas
    var newMartiansLikelihood = 0.017;
if (random(0,1) < newMartiansLikelihood) {
    martians.push(makeMartian(0));
}
}

function martianMove() { // allows the martians to glide across screen
    this.x += this.speed;
}

function displayMartian() { //draws the martian.
    fill(12, 63, 117);
    noStroke();
    push();
    translate(this.x, height - 60);
    // body
    ellipse(20, 30, this.breadth, this.height);
    // white part of eye
    fill(255);
    ellipse(20, 20, this.breadth / 2, this.breadth / 2);
    //blue part of eye
    fill(105, 160, 219);
    ellipse(20, 20, 10, 10);
    //antennas
    stroke(105, 160, 219);
    strokeWeight(4);
    line(10, 10, 5, 5);
    line(30, 10, 35, 5);
    //ends of antenna
    fill(random(255), random(100), random(200));
    noStroke();
    ellipse(5, 5, 10, 10);
    ellipse(35, 5, 10, 10);

    pop();
}

function makeMartian(birthLocationX){ // martian characteristics
    var alien = {x: birthLocationX,
                breadth: 30,
                height: 50,
                speed: random(3, 7),
                move: martianMove,
                display: displayMartian};
    return alien;
}

Rough sketch.
Screenshot of the music video I took inspiration from.

For this project, I wanted to create a fictional landscape of Mars, so I took a bit of inspiration from the iconic Britney Spears’ Oops I did it again Music Video (I wanted to add an astronaut but I didn’t know how to remove the background of a picture I found online) and added my own twist by putting in blue aliens that greet you with their antennas as you pass glance over the Martian landscape. I had a lot of fun making this project as it helped me understand the use of objects and characteristics better!

Sarah Choi – Project 11 – Landscape

project-11

//Sarah Choi
//sychoi
//Section D
//Project-11

var buildings = [];
var birds = [];
var terrainSpeed = 0.0001;
var terrainDetail = 0.005;


function setup() {
    createCanvas(480, 480); 
    frameRate(10);
    
    for (var i = 0; i < 10; i++){
        var rx = random(width);
        var ry = random(height);
        buildings[i] = makeBuilding(rx);
        birds[i] = birdsFlying(rx, ry);
    }
}


function draw() {
    background(200); 
    
    displayHorizon();

    drawMountain();
    
    updateAndDisplayBuildings();
    removeBuildingsThatHaveSlippedOutOfView();
    addNewBuildingsWithSomeRandomProbability(); 

    birdsFlying();
    birdMovement();
    displayBird();
    updateBird();
    addBird();
    removeBird();
}

function drawMountain() {
    fill(150, 60, 50);
    noStroke();
    beginShape();
    for (x = 0; x < width; x++) {
        var m = (x * terrainDetail) + (millis() * terrainSpeed);
        var y = map(noise(t), 0, 1, 0, height);
        vertex(x, y);
    }
    vertex(width, height);
    vertex(0, height);
    endShape();
}

function updateAndDisplayBuildings(){
    // Update the building's positions, and display them.
    for (var i = 0; i < buildings.length; i++){
        buildings[i].move();
        buildings[i].display();
    }
}


function removeBuildingsThatHaveSlippedOutOfView(){
    var buildingsToKeep = [];
    for (var i = 0; i < buildings.length; i++){
        if (buildings[i].x + buildings[i].breadth > 0) {
            buildingsToKeep.push(buildings[i]);
        }
    }
    buildings = buildingsToKeep; // remember the surviving buildings
}


function addNewBuildingsWithSomeRandomProbability() {
    // With a very tiny probability, add a new building to the end.
    var newBuildingLikelihood = 0.007; 
    if (random(0,1) < newBuildingLikelihood) {
        buildings.push(makeBuilding(width));
    }
}


// method to update position of building every frame
function buildingMove() {
    this.x += this.speed;
}
    

// draw the building and some windows
function buildingDisplay() {
    var floorHeight = 20;
    var bHeight = this.nFloors * floorHeight; 
    fill(255); 
    stroke(0); 
    push();
    translate(this.x, height - 40);
    rect(0, -bHeight, this.breadth, bHeight);
    stroke(200); 
    for (var i = 0; i < this.nFloors; i++) {
        rect(5, -15 - (i * floorHeight), this.breadth - 10, 10);
    }
    pop();
}


function makeBuilding(birthLocationX) {
    var bldg = {x: birthLocationX,
                breadth: 50,
                speed: -1.0,
                nFloors: round(random(2,8)),
                move: buildingMove,
                display: buildingDisplay}
    return bldg;
}


function displayHorizon(){
    stroke(0);
    line (0, height - 50, width, height - 50); 
}

function birdsFlying(birdX, birdY) {
    var bird = {x: birdX,
                y: birdY,
                speed: random(5, 20),
                size: random(5, 20),
                color: random(0, 100),
                move: birdMovement,
                display: displayBird}
    return bird;
}

function birdMovement() {
    this.x += this.speed;
    this.y += this.speed / 5;
}

function displayBird() {
    strokeWeight(1);
    stroke(this.color);
    noFill();
    push();
    translate(this.x, this.y);
    arc(0, 0, this.size, this.size, PI + QUARTER_PI, 0);
    arc(this.size, 0, this.size, this.size, PI, - QUARTER_PI);
    pop();
}

function updateBird() {
    for (i = 0; i < birds.length; i++) {
        birds[i].move();
        birds[i].display();
    }
}

function addBird() {
    var newBird = random(1);
    if (newBird < 0.2) {
        var birdX = 0;
        var birdY = random(height);
        birds.push(displayBird(birdX, birdY));
    }
}

function removeBird() {
    var stayBird = [];
    for (i = 0; i < birds.length; i++) {
        if (birds[i].x + birds[i].size > 0) {
            stayBird.push(birds[i]);
        }
    }
    birds = stayBird;
}

I wanted to show birds with the buildings in the background. Growing up in a city, there were always tall skyscrapers and birds flying everywhere especially next to really big parks. I love walking around in the city where you can breathe in the fresh air and feel so free in an area where you grew up.

I was unable to figure out how to make both the birds and the buildings to appear in my code. Although in the end, I was still unsure how to make my code work, I hope the code is enough to show my efforts.

Lauren Park – Looking Outwards – 11

Camille Utterback’s “Abundance” is a commissioned artwork by ZER01 that was publicly installed in San Jose. This piece involves a setup video camera that takes the images and movements of people at the plaza, in order to translate these images and display it by projecting an animation. This animation shows silhouettes in color, of those walking in the plaza. These silhouettes are colored in cool tones unless if people are walking in groups, where then the silhouettes would be warm colored. I really admire how the artist aimed to create a piece that was ongoing and constantly changing by taking the whole environment of the plaza and transforming it into a digital piece. Different colored silhouettes seem to be highly significant, in how the public can easily view how many of those in the plaza came by themselves. Because of this, this project overall seems to create a conversation between strangers in a way. 

The artist Camille Utterback studied at Williams College and got her masters from NYU’s Tisch School Of The Arts. She currently works as an assistant professor of Art Practice at Stanford University. She is interested in creating interactions between technology and people, and so she continues to create digital artworks that connect computational softwares and human behavior.

“Abundance”(2007) by Camille Utterback