Project 11: Landscape

sketchDownload
 /*
Nicholas Wong
Section A
nwong1@andrew.cmu.edu
*/

var rockForeground = []; //Rocks in foreground
var rockMidground = []; //Rocks in midground
var mountains = []; //Mountains in background

//Rock variables
var foregroundRockChance = 0.03; //Probability of rock spawn per frame
var midgroundRockChance = 0.03; //Probability of rock spawn per frame

//Mountain variables
var noiseParam = 1; //Noise param for mountain generation
var noiseStep = 0.01; //Noise step for mountain generation

//Sky variables
var offset = 23; //Wave offset

//Floor grid variables
var lineStart = []; //Line at horizon
var lineEnd = []; //Line at bottom of canvas

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

    //Initialize mountains
	for(let i = 0; i < width/4; i++)
	{
		var n = noise(noiseParam);
		mountains[i];
		var value = map(n, 0, 1, 0, height);
		mountains.push(value);
		noiseParam += noiseStep;
	}

	//Initialize Floor lines
	for(let i = 0; i<49; i++)
	{
		lineStart[i] = 10*i;
		lineEnd[i] = -1200 + (60*i);
	}

}

function draw() 
{

	background(255, 166, 200);

	//Draw sky wave
	drawSkyPattern();

	//Draw mountains
	drawMountains();

	//Draw floor
	drawFloor();

	//Draw floor lines
	drawFloorLines();


	//Color for rocks
	var foregroundColor = color(115, 31, 77);
	var midgroundColor = color(130, 57, 84);

	//Create rocks based on probability
	if(random(0,1) < foregroundRockChance)
	{
		rockForeground.push(createRock(width + 20,220 + random(0,20),20,random(20,30),foregroundColor)); //Rocks in foreground
	}
	else if (random(0,1) < midgroundRockChance)
	{
		rockMidground.push(createRock(width + 20, 190 + random(-20,20),10, 20, midgroundColor)); //Rocks in background
	}

	//Update positions
	updateMidgroundRocks();
	updateForegroundRocks();
}

//Draw wave
function drawSkyPattern()
{
	push();
	noFill();
	for(let w = 0; w <= height; w += 10) //Number of waves
    {       
        strokeWeight(1)
        stroke(255)

        //Create curvy lines
        beginShape();
		for(let x = 0; x < width; x++)
		{
		    let angle = offset + x *0.01;
		    let y = map(sin(angle), -1, 1, 0, 50);
		    vertex(x,y + w);
		}
		vertex(width,height);
		vertex(0,height);
		endShape();
    }
    pop();


}

//Draw mountains
function drawMountains()
{
	//Add and remove noise values to mountain list
	mountains.shift();
    var n = noise(noiseParam);
    var value = map(n, 0, 1, 0, height);
    noiseParam += noiseStep;
   	mountains.push(value);
	

	//Draw mountain shapes based on noise values
    beginShape();
    for(var i = 0; i <= width/4; i++)
    {
	    fill(224, 105, 149);
	    noStroke();
	    vertex((i * 6), mountains[i] - 50); 
	    vertex((i + 1) * 6, mountains[i + 1] - 50);   
	    vertex(300, 100000); 
    }
    endShape(CLOSE);

	//Draw mountain shapes based on noise values
    beginShape();
    for(var i = 0; i <= width/3; i++)
    {
	    fill(191, 86, 125);
	    noStroke();
	    vertex((i * 10), mountains[i]- 10); 
	    vertex((i + 1) * 10, mountains[i + 1] - 10);   
	    vertex(300, 100000); 
    }
    endShape(CLOSE);
}

//Update and cull rocks
function updateForegroundRocks()
{
	for(let i = 0; i < rockForeground.length; i++)
	{
		rockForeground[i].move();
		rockForeground[i].display();

		//Check to see if rocks are off canvas
		if(rockForeground[i].x + rockForeground[i].size < 0)
		{
			rockForeground.shift(); //Remove rock
		}
	}
}

//Update and cull rocks
function updateMidgroundRocks()
{
	//Check to 
	for(let i = 0; i < rockMidground.length; i++)
	{
		rockMidground[i].move();
		rockMidground[i].display();

		//Check to see if rocks are off canvas
		if(rockMidground[i].x + rockMidground[i].size < 0)
		{
			rockMidground.shift(); //Remove rock
		}
	}
}

//Draw floor lines
function drawFloorLines()
{
	push();
	for(let i = 0; i < 49; i++)
	{
		stroke(255, 148, 194);
		strokeWeight(1);

		//Draw line
		line(lineStart[i],170,lineEnd[i],height);

		//Move lines
		lineStart[i] -= 5;
		lineEnd[i] -= 30;

		//Reset lines if off canvas
		if(lineStart[i] == 0)
		{
			lineStart[i] = width;
		}
		if(lineEnd[i] == -1200)
		{
			lineEnd[i] = 1680;
		}
	}
	pop();
}

//Draw floor rectangle
function drawFloor()
{	
	push();
	noStroke();
	fill(158, 70, 102);
	rect(0,170,width,height);
	pop();
}



//Create rock
function createRock(xPos, yPos,rockSpeed, rockSize, rockColor, )
{
	var fRock = {x: xPos, 
				y: yPos,
				speed: rockSpeed * -1,
				sides: random(3,5),
				size: rockSize,
				color: rockColor,
				variation: random(0.5,1),
				move: rockMove,
				display: rockDisplay}
	return fRock;
}

function rockMove()
{
	this.x += this.speed; //Move the rock
}

function rockDisplay()
{
	//Change rock color
	fill(this.color);
	noStroke();

	//Create rock based on size, variation, and number of sides
	let angle = TWO_PI / this.sides;
	beginShape();
	for (let a = 0; a < TWO_PI; a += angle) 
	{
	let sx = this.x + cos(a * this.variation) * this.size;
	let sy = this.y + sin(a * this.variation) * this.size;
	vertex(sx, sy);
	}
	endShape(CLOSE);
}

A stylized desert. Rocks are objects that are randomly generated, and are automatically culled when off the canvas. Rocks further away from the bottom of the canvas move slower than rocks closer to the bottom of the canvas. Mountains vary in speed to give the illusion of depth.

Inspiration:

Mountains eps 10 background view pink Royalty Free Vector

LookingOutwards-11

Amber Vittoria’s illustration for Gucci Knitwear

use of soft and blurred colors, rounded body features

Amber Vittoria is a New York based artist and illustrator who is skillfully good at combing the analog and the digital in illustration. I came across an illustration project from her that is a commission for Gucci’s DIY knitwear collection. Exclusively working with female form and body parts in his drawing, she visualizes all kinds of stylized bodies into fashion campaign. The beginning of this practice is because of she recognizes that most of women cannot relate to the unrealistic image of women being used in fashion content and she hope to create these unique characters in a storytelling way. The soft and blurred colors portraits non-traditional, or non-idealised, representations of the female form with rounded body features and colorful flowers. Besides the visuals, I also admire how she take advantage of her creative experience to discuss these topics with the public.

Artist Website: https://www.ambervittoria.com/

Project 11-Landscape

sketch
/*
Lauren Kenny
lkenny@andrew.cmu.edu
Section A

This draws a moving scene.
*/

var buildings = [];
var clouds = [];
var hills = [];
var noiseParam=0;
var noiseStep=0.05;


function setup() {
    createCanvas(480, 300); 
    
    // create an initial collection of buildings
    for (var i = 0; i < 5; i++){
        var rx = random(width);
        buildings[i] = makeBuilding(rx);
    }
    frameRate(10);

    // create an initial collection of clouds
    for (var i = 0; i < 10; i++){
        var rx = random(width);
        clouds[i] = makeCloud(rx);
    }

    // creates initial hills
    for (var i=0; i<width/5; i++) {
        var n = noise(noiseParam);
        var value = map(n, 0, 1, 0, height);
        hills.push(value);
        noiseParam+=noiseStep;
    }

}


function draw() {
    background(255,140,102);
    // draws outline around canvas
    stroke(0);
    strokeWeight(10);
    fill(255,140,102);
    rect(0,0,width,height);

    // draws sun
    strokeWeight(3);
    fill(183,52,52);
    circle(width/2,height/1.2,400);
    fill(229,134,81);
    circle(width/2,height/1.2,300);
    fill(225,185,11);
    circle(width/2,height/1.2,200);
    
    
    // begins the hill shape
    var x=0;
    stroke(0);
    strokeWeight(3);
    fill(93, 168, 96);
    beginShape();
    curveVertex(0, height);
    curveVertex(0, height);
    // loops through each of the values in the hills array
    for (i=0; i<hills.length; i++) {
        curveVertex(x, hills[i]);
        x+=15;
    }
    curveVertex(width, height);
    curveVertex(width, height);
    endShape();
    //removes the first value from the list and appends a new one
    //onto the end to make the terrain move
    hills.shift();
    var n = noise(noiseParam);
    var value = map(n, 0, 1, 0, height);
    hills.push(value);
    noiseParam+=noiseStep;

    displayHorizon();

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

    updateAndDisplayClouds();
    removeCloudsThatHaveSlippedOutofView();
    addNewCloudsWithSomeRandomProbability();

    
}


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 updateAndDisplayClouds() {
    // update the clouds' positions and display them
    for (var i=0; i<clouds.length; i++) {
        clouds[i].move();
        clouds[i].display();
    }
}


function removeBuildingsThatHaveSlippedOutOfView(){
    // If a building has dropped off the left edge,
    // remove it from the array.  This is quite tricky, but
    // we've seen something like this before with particles.
    // The easy part is scanning the array to find buildings
    // to remove. The tricky part is if we remove them
    // immediately, we'll alter the array, and our plan to
    // step through each item in the array might not work.
    //     Our solution is to just copy all the buildings
    // we want to keep into a new array.
    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 removeCloudsThatHaveSlippedOutofView() {
    var cloudsToKeep = [];
    for (var i=0; i<clouds.length; i++) {
        if (clouds[i].x + clouds[i].width>0) {
            cloudsToKeep.push(clouds[i]);
        }
    }
    clouds = cloudsToKeep;
}


function addNewBuildingsWithSomeRandomProbability() {
    // add a new building
    var newBuildingLikelihood = 0.007; 
    if (random(0,1) < newBuildingLikelihood) {
        buildings.push(makeBuilding(width));
    }
}

function addNewCloudsWithSomeRandomProbability() {
    // add a new cloud
    var newCloudLikelihood = 0.001;
    if (random(0,1) < newCloudLikelihood) {
        clouds.push(makeCloud(width));
    }
}


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

// updates the position of every cloud frame
function cloudMove() {
    this.x += this.speed;
}
    

// draw the building and some windows
function buildingDisplay() {
    var floorHeight = 20;
    var bHeight = this.nFloors * floorHeight; 
    fill(53,156,249); 
    stroke(0);
    strokeWeight(3); 
    push();
    translate(this.x, height - 40);
    rect(0, -bHeight, this.breadth, bHeight);
    fill(255);
    //rect(this.breath/2, bHeight-20, this.breath/5, bHeight/5);
    rect(5, -35, 10, (bHeight/5));
    pop();

}

function cloudDisplay() {
    fill(255);
    noStroke();
    //stroke(0);
    //strokeWeight(3);
    push();
    //translate(this.x, height-40);
    ellipse(this.x, this.y, this.width, this.height);
    ellipse(this.x+this.width/2, this.y+3, this.width, this.height);
    ellipse(this.x-this.width/2, this.y+3, this.width, this.height);
    pop();
}


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

function makeCloud(startX) {
    var cloud = {x: startX,
                y: random(20,90),
                width: random(10,20),
                height: random(10,20),
                speed: -1.0,
                move: cloudMove,
                display: cloudDisplay}
    return cloud;
}


function displayHorizon(){
    noStroke();
    fill(155,27,66);
    rect(0, height-50, width, 50);
    stroke(0);
    strokeWeight(3);
    line (0, height-50, width, height-50);

}

Looking Outward-11

This project is called Botanicals. It was created by Kate Hartman as a way to form a stronger connection between humans and plants. This project uses Arduino and other software to read what a plant needs and then communicate that to its human. I love that this project plays on something light and funny, but also very relevant and useful. Kate Hartman is based in Toronto and teaches at OCAD University about Wearable and Mobile Technology.

Project: 11

I really enjoyed creating this even though it took me a while to understand objects, I feel the birds and pagoda along with the colour tones were extremely soothing!

sketch

//Aadya BHartia
//Section A 
//abhartia@andrew.cmu.edu

/* the program shows a river and mountains as well as pagodas, the birds and pagodas along with the 
variation in landscape help the visuals become more interesting and dynamic */

//variables to store colurs
var c1;
var c2;
//storing birds in an array 
var birds = [];
//pagoda in an array
var pagodas = [];
//water speed
var waterSpeed = 0.0001;

function setup() {
    createCanvas(400, 400);
    c1 = color(218, 239, 252);
    c2 = color(240, 198, 196);
    frameRate(15);
    //create an initial collection of birds
    for(var i = 0; i<5; i++){
    	var birdX = random(width);
    	var birdY = random(0, height/3);
    	birds[i] = drawBird(birdX, birdY);
    }
    //create an initial collection of pagodas 
    for(var k = 0; k<2; k++){
    	var pagodaX = random(width);
    	var pagodaY = random(250, 300); 
    	pagodas[k] = drawPagoda(pagodaX, pagodaY);
    }
}

function draw() {
	gradient(c1, c2);
	drawMountain2(); //background mountains 
	drawMountain();//foreground mountains 
	//pagoda update functions 
	pagodaUpdate();
	pagodaAppear();
	pagodaDisappear();
	//water level
	drawWater();
	drawWater2();
	//birds in the sky
	birdUpdate();
	birdAppear();
	birdDisappear();
}

//background gradient from blue to light orange 
function gradient(c1,c2){
	noFill();
	noStroke();
	for(var i = 0; i<height; i++){
		var a = map(i, 0, height, 0, 1);
		var c = lerpColor(c1,c2,a);
		stroke(c);
		line(0, i, width, i);	
	}
}
//function to display water in foreground 
function drawWater(){
	var water1 = 0.001;
	var speedW1 = 0.0003;
	noStroke();
	fill(189, 210, 222);
	beginShape();
	for(var i = 0; i<width; i++){
		var x = i*water1 + millis()*speedW1;
		var y = map(noise(x), 0, 1, 260, 300);
		vertex(i, y);
	}
	vertex(width, height);
	vertex(0, height);
	endShape();
}
function drawWater2(){
	//function to display second shade water in foreground  
	var water2 = 0.001;
	var speedW2 = 0.0001;
	fill(163, 198, 218);
	beginShape();
	for(var i = 0; i<width; i++){
		var x = i*water2 + millis()*speedW2;
		var y = map(noise(x), 0, 1, 290, 350);
		vertex(i, y);
	}
	vertex(width, height);
	vertex(0, height);
	endShape();
}
function drawMountain(){
	var mount1 = 0.014;
	var speedM1 = 0.0008;
	//foreground mountain
	stroke(249, 224, 226); 
	beginShape();
	for(var i = 0; i<width; i++){
		var x = i*mount1 + millis()*speedM1;
		var y = map(noise(x), 0,1.5,height/6, height);
		line(i, y, i, height);
	}
	endShape(); 
	//shading for foreground mountain 
	for(var k = width/2; k<4*width/5; k++){
		var z = map(k, width/2,4*width/5,0, 255);
		stroke(246, 188, 192,z);
		line(0, k, width, k);
	}
}
function drawMountain2(){
	var mount2 = 0.009;
	var speedM2 = 0.001;
	//background mountain
	stroke(246, 188, 192); 
	beginShape();
	for(var i = 0; i<width; i++){
		var x = i*mount2 + millis()*speedM2;
		var y = map(noise(x), 0,1.5,20, 2*height/3);
		line(i, y, i, height);
	}
	endShape();
	//shading for background mountain	
	for(var k = width/4; k<2*width/3; k++){
		var z = map(k, width/4,2*width/3,0, 255);
		stroke(249, 224, 226,z);
		line(0, k, width, k);
	}
}

//pagodas
function pagodaMove(){
	//update speed of every pagoda 
	this.x1 -= this.speed; 
}
function pagodaMake(){
	noFill();
	stroke(80);
	strokeWeight(2);
	//making the pagoda 
	line(this.x1, (this.y1+50) , this.x1, (this.y1-40));
	line(this.x1+30, (this.y1+50) , this.x1 +30, (this.y1-40));
	strokeWeight(4);
	line(this.x1, (this.y1-35), this.x1+30, (this.y1-35));
	strokeWeight(6);
	line(this.x1-5, (this.y1-42), this.x1+35, (this.y1-42));
}
function pagodaUpdate(){
	// Update the pagodas's positions, and display them.
	for(var i = 0; i< pagodas.length; i++){
		pagodas[i].shift();
		pagodas[i].display();
	}
}
function pagodaAppear(){
	//with a tiny probablilty adding pagodas 
	if(random(0,1)<0.007){
		var pagodaX = width; 
		var pagodaY = random(250, 300 ); 
		pagodas.push(drawPagoda(pagodaX, pagodaY));
	}
}
function pagodaDisappear(){
	//removing pagodas which have reached the edge 
	var pagodasKeep = [];
	for(var i = 0; i<pagodas.length; i++){
		if(pagodas[i].x1 + pagodas[i].bredth > 0){
			pagodasKeep.push(pagodas[i]);
		}
	}
	pagodas = pagodasKeep;
}
function drawPagoda(pagodaX, pagodaY){
	var pagoda = { x1: pagodaX, y1: pagodaY, 
		speed: 4, bredth: 30,
		shift: pagodaMove, display: pagodaMake}
	return pagoda;	
}

//birds 
function drawBird(birdX, birdY){
	var bird = { x: birdX, y: birdY, 
		velocity: random(4,8), size: random(6,10),
		move: birdMove, show: birdMake}
	return bird;	
}

function birdMove(){
	//update speed of every birds 
	this.x -= this.velocity; 
	this.y -= this.velocity/random(5,10);
}
function birdMake(){
	noFill();
	stroke(80);
	strokeWeight(1);
	arc(this.x, this.y, this.size, this. size/2, PI, TWO_PI);
	arc(this.x+ this.size, this.y, this.size, this. size/2 ,PI, TWO_PI);
}
function birdUpdate(){
	// Update the birds's positions, and display them.
	for(var i = 0; i< birds.length; i++){
		birds[i].move();
		birds[i].show();
	}
}
function birdAppear(){
	//with a tiny probablilty adding birds 
	if(random(0,1)<0.1){
		var birdX = width; 
		var birdY = random(0, height/3 ); 
		birds.push(drawBird(birdX, birdY));
	}
}
function birdDisappear(){
	//removing birds which have reached the edge 
	var birdsKeep = [];
	for(var i = 0; i<birds.length; i++){
		if(birds[i].x + birds[i].size > 0){
			birdsKeep.push(birds[i]);
		}
	}
	birds = birdsKeep;
}

Looking Outwards: 11

Jenny Sabin is an American architect, designer, artist, a professor in Cornell AAP, and an experimental architect with her own studio based in Ithaca, NY. Her design focuses on cutting-edge technologies and emphasizes computational design, data, visualization, and digital fabrication.

A_Lumen_Jenny-Sabin-Studio_Photo-by-Pablo-Enriquez.jpg


Lumen (2017) by Jenny Sabin is a digitally fabricated architectural work that won the 2017 Museum of Modern Art’s PS1 Young Architect’s Program. The socially and environmentally responsive structure is made of a lightweight knitted fabric that adapts to the densities of bodies, heat, and sunlight. Lumen is a feminine form that offers luminous interiorities, informal networks, social fabrics, and fibrous assemblages that are pliable, transformative, and playful.


I found Jenny’s work particularly interesting as in my architecture studio we are currently working with environmentally responsive structures with algae and this related back to it perfectly and now I am using this particular project as a precedent for my design.


Project 11: Landscape

This landscape wasn’t the most challenging but the UFO really wasn’t the easiest to get working. I had to experiment a lot with the order of my elements in the draw function to get it looking like it should and it took some testing to get it to move around on the campus and get back on when it flew away.

sketch

var chasm = []
var alien = []
var roadLines = []



function makeLines(lineY, lineLength){  ///creates the yellow lines on the road
  l = {y: lineY, length: lineLength, drawFunction: drawLines, stepFunction: moveLines}
  return l
}

function drawLines(){
  push()
  translate(190, this.y)
  stroke(255, 255, 0)
  line(0, 0, 0, this.length)
  pop()
  push()
  translate(210, this.y)
  stroke(255, 255, 0)
  line(0, 0, 0, this.length)
  pop()
}

function moveLines(){ ////advances the lines so it appears the viewer is moving over the road
  this.y += 10
  if (this.y >= 420){
    roadLines.shift()
    roadLines.push(makeLines(-100, random(0, 200)))
  }

}

function makeUFO(ufoX, ufoY, ufoDX, ufoDY){ ////draws the hovering ufo
  ufo = {x: ufoX, y: ufoY, dx: ufoDX, dy: ufoDY, drawFunction: drawUFO, stepFunction: ufoFly}
  return ufo
}

function drawUFO(){ 
  push()
  translate(this.x, this.y)
  fill(100)
  ellipse(0, 0, 125, 125)
  fill(227, 252, 252)
  ellipse(0, 0, 70, 70)

  for (var t = 0; t <= 10; t++){
    fill(random(0, 255), random(0, 255), random(0, 255))
    ellipse(0, -48, 10, 20)
    rotate(12)
}
pop()
}

function ufoFly(){ ////keeps the ufo flying around the scene if it hits an edge
  this.x += this.dx
  this.y += this.dy
if (this.x >= 400 || this.y >= 400){
  this.dx = random(-5, 5)
  this.dy = random(-5, 5)
  this.dx *= -1
  this.dy *= -1
}
if (this.x <= 0 || this.y <= 0){
  this.dx = random(-5, 5)
  this.dy = random(-5, 5)
  this.dx *= -1
  this.dy *= -1
}



}
function makeChasm(cx, cy){ ///makes the creatures and features on the road
  c = {x: cx, y: cy, type: round(random(0, 3)), drawFunction: chasmDraw, move: chasmAdvance}

return c
}

function chasmDraw(){
  stroke(255)
  translate(this.x, this.y)
  switch (this.type){
  case 0: ////spider alien
  stroke(50) 
  for (u = 0; u <= 8; u++){
  line(0, 0, random(-20, 20), random(-20, 20))
  } 
    break;
   case 1: ////lava pit
   stroke(252, 90, 3)
   line(0, 0, 20, 20)
   line(20, 20, 0, 30)
   line(0, 30, 0, 40) 
   line(0, 40, 20, 60)
   line(20, 60, 0, 80)
   break;
   case 2: ////green alien
   stroke(86, 237, 40)
   line(0, 0, 60, 60)
   line(0, 0, -60, -60)
   line(0, 0, 60, 120)
   line(0, 0, -60, 120)
   stroke(0)
   fill(86, 237, 40)
   ellipse(0, 0, 20, 80)
   break;
   case 3: ////portal thing????
    strokeWeight(3)
    stroke(189, 36, 209)
  fill(0)
   beginShape()
   vertex(0,-40)
   vertex(20, 20)
   vertex(30, 30)
  vertex(20, 40)
  vertex(10, 50)
  vertex(0, 60)
  vertex(-10, 50)
  vertex(-20, 40)
  vertex(-30, 30)
  vertex(-20, 20)
  vertex(0, -40)
   endShape()   
   break;
  }
  

}



function chasmAdvance(){ ////moves the features and makes a new one when one disappears
     translate(0, this.y += 2)
     if (this.y >= width){
      chasm.shift()
      chasm.push(makeChasm(random(0, 400), -200)) 
     }
}



function setup() { ////creates and pushes all of the parts to arrays to be drawn
    createCanvas(400, 400); 
    for (var o = 0; o <= 4; o++){
      var c = makeChasm(random(0, 400), -200)
      chasm.push(c)
    }
    var ufo = makeUFO(200, 200, random(-10, 10), random(-10, 10))
    alien.push(ufo)
    for (var k = 0; k <= 4; k++){
      var l = makeLines(0, random(0, 200))
      roadLines.push(l)
    }

}


function draw() { ////draws each feature and calls their functions
  background(168, 125, 50)
  road()
  for (var k = 0; k <= 4; k++){
    var l = roadLines[k]
    l.stepFunction()
    l.drawFunction()   
  }
  var ufo = alien[0]
  noStroke()
  ufo.stepFunction()    
  ufo.drawFunction()
    for (var o = 0; o <= 4; o++){
      var c = chasm[o]
      c.move() 
      c.drawFunction()
}  
}


function road(){ ///creates the road for the features to be built on
  fill(162, 168, 163)
  rect(100, 0, 200, 400)
  strokeWeight(6)
  stroke(255, 255, 255)
  line(100, 0, 100, 400)
  line(300, 0, 300, 400)
}

LO 11

I researched Yael Kanarek’s website and interactive art piece World of Awe. It’s an extremely impressive narrative website, with three separate stories and uniquely generated terrain for visitors to explore. The most interesting part is that a visitor’s movements in World of Awe are tracked and used to form a new art piece, filled with references to where each visitor has been and connecting everyone in the story’s various locations. It’s such a gorgeous piece of art, and it takes my mind to a lot of locations I’ve read about in books, or fantasy locations from board games or movies. I love the depth and richness of it. Kanarek herself is an artist who works with language in the modern era, and has won many awards for her work in the field of communicative art. One of her guiding principles in her work is her view of the Internet as bridging the gap between human and computer communication, and this concept is extremely present in all of her work, especially World of Awe. In addition to teaching at the Pratt Institute and her personal work, she has founded a text-based jewelry company called Kanarek, and is an artist in residence at the Romemu Center, working on regendering the Bible.

11 – Landscape

I was motivated by my experiencing driving. Additionally, a lot of the projects from previous years and such seem to have objects move left or right off the screen, or top to bottom, but I haven’t seen any with “one-point” perspective, so I thought I would give it a try. It was a little challenging and I would’ve like to have made the roadlines move in the mirror as well, but I just couldn’t figure it out.

sketch.sarlDownload
// Sarah Luongo
// Sluongo
// Section A
// Project

// This code aims to articulate the perspective of driving on the road, showing
//different scenery as the car moves forward.

var lines = [];
var cds = [];
var gps;

function preload() {
    gps = loadImage('https://i.imgur.com/tOwIpKP.png');
}

function setup() {
    createCanvas(420, 480);
    background(17, 124, 19);
    gps.resize(100, 100);
    // Creates 6 initial roadline objects
    for (var i = 0; i < 6; i++) {
        lines[i] = makeRoadlines(220,i*(7+(i*7)), i+4, (i+1)*10, -0.1, 0.4, i);
    }
    // Creates 2 initial cloud objects
    for (var i = 0; i < 2; i++) {
        cds[i] = makeCloud(100+(i*200), 40, 50, 40, .3);
    }
}

function draw() {
    road();
    roadlines();
    sky();
    updateRoads();
    driverseat();
}

function driverseat() {
    //Dashboard
    noStroke();
    fill(50);
    rect(0, 360, width, 120);

    //Fuel Meter and Speedometer
    fill('white');
    circle(110, 430, 50);	
    circle(190, 430, 50);
    fill('black');
    circle(110, 430, 40);
    circle(190, 430, 40);

    // Fuel meter lines
    push();
    translate(110, 430)
    rotate(radians(-45));
    for (var i = 0; i < 5; i++) {
	stroke('white');
        strokeWeight(.8);
	line(-15, 0, -10, 0);
	rotate(radians(55));
    }
    pop();

    // Speedometer lines
    push();
    translate(190, 430)    
    rotate(radians(-45));
    for (var i = 0; i < 10; i++) {
        stroke('white');
        strokeWeight(.8);
        line(-15, 0, -10, 0);   
        rotate(radians(25));
    }
    pop();
   
    // Needle
    fill('red');
    push();
    translate(110, 430);
    triangle(-2, -6, 8, 16, 12, 14);
    translate(80, 0);
    triangle(-2, -6, 8, 16, 12, 14);
    pop();

    //Steering Wheel
    stroke('black');
    strokeWeight(20);
    noFill();
    arc(150, 490, 200, 200, PI, PI);
    noStroke();
    fill('black');
    ellipse(150, 500, 200, 100);

    // GPS
    image(gps, 300, 380);

    //Mirror
    fill('black');
    rect(300, 0, 120, 45);
    fill(17, 124, 19);
    rect(310, 0, 100, 35);
    fill('gray');
    triangle(310, 35, 350, 0, 400, 35);
    fill('lightblue');
    rect(310, 0, 100, 10); 
}

function road() {
    noStroke();
    fill('gray');
    triangle(-(width), height, width/2, 80, 1.5*width, height);
}

function sky() {
    noStroke();
    fill('lightblue')
    rect(0, 0, width, 100);
    
    // Sun
    fill('yellow');
    circle(10, 10, 70);

    // Clouds
    clouds();
    updateClouds();
}

function roadlines() {
    fill('white');
    push();
    rotate(radians(20));
    for (var i = 0; i < 6; i++) {                           
        rect(lines[i].x, lines[i].y, lines[i].sx, lines[i].sy);
    }
    pop();
}

function makeRoadlines(xPos, yPos, xSize, ySize, changeX, changeY, c) {
    var roadlines = {x: xPos, y: yPos,
	             sx: xSize, sy: ySize,
                     dx: changeX, dy: changeY,
                     change: c}
    return roadlines;
}

// Updates roadlines & adds to size of road as it moves towards bottom of canvas
function updateRoads() {
    for (var i = 0; i < 6; i++) {
        // Makes new line when each line is greater than 300
        if (lines[i].y > 300) {
            lines[i] = makeRoadlines(220,0*(7+(0*7)),
	    0+4, (0+1)*10, -0.1, 0.4, 0);
	    // How far apart each line is
	    var k = i;
            for (var j = 0 ; j < 6; j++) {
	        if (k > 5) {
		    k = 0;
		}
	        lines[k].change = j;
		k++;
	    }
        }
	// Makes lines move and change size toward bottom of canvas
	lines[i].y += lines[i].dy + lines[i].change/4;
	lines[i].sx += 0.01;
	lines[i].sy += 0.1;
    }
}

function makeCloud(xPos, yPos, w, h, changeX) {
    var clouds = {x: xPos, y: yPos,
	          dx: changeX}
    return clouds;
}

function clouds() {
    fill('white');
    for (var i = 0; i < 2 ; i++) {
        ellipse(cds[i].x, cds[i].y, 50, 40);
        ellipse(cds[i].x + 20, cds[i].y + 20, 50, 40);
        ellipse(cds[i].x + 30, cds[i].y - 10, 50, 40);
        ellipse(cds[i].x + 60, cds[i].y + 15, 50, 40);
        ellipse(cds[i].x + 70, cds[i].y, 50, 40);
    }
}

// Makes cloads reappear at the left of the screen
function updateClouds() {
    // If cloads greater than 450 makes new one reappear from left of canvas
    for (var i = 0; i < 2; i++) {
        if (cds[i].x > 450) {
	    cds[i].x = -100;
	}
        // Makes them move towards right of canvas
	cds[i].x += cds[i].dx;
    }
}

Looking Outwards 11:

I’ve seen Angela Washko’s work before, and I find her exploration of feminism through interactive alternative video games. One such game I found interesting was The Game: The Game, a project that presents an exploration of consent and politics. The game is presented in the format of a dating simulator, where players experience the tactics and practices of male pick-up artists and “the seduction community”. These pick-up gurus attempt to seduce the player, providing and in-depth look into the specific social behaviors around dating, giving insight on the experiences many women have in the real world.

Angela Washko is a visiting assistant professor at Carnegie Mellon University, a small University in Pittsburgh, Pennsylvania (often mistaken for Central Michigan University). She was known for creating performances and “social stunts” in the game World Of Warcraft, where she discusses feminism and toxic masculinity in video games. Having attended a few of her classes, I find her style of critiquing patriarchal systems and toxic-masculinity online very amusing.

https://angelawashko.com/section/437138-The-Game-The-Game.html