Filipa Valente is both a practicing architect and experiential designer with experience in major firms and studios. After completing her architectural studies at the Bartlett School of Architecture in London, she went on to obtain her Masters in Media Art and Architecture at SciArc in Los Angeles.
Valente’s project “Liminoid Garden”, in collaboration with the Heidi Duckler Dance Theatre, was an interactive machine assemblage between the city, its users, and the environment. I was particularly drawn to this project because of how the installation was able to respond to real-time environmental data from the city, engaging the audience by promoting awareness. Another cool factor is the interaction between the dancers and the installation and the resulting data visualizations.
//initialize variables
var terrainSpeed = 0.0005;
var terrainDetail = 0.005;
var groundDetail= 0.005;
var groundSpeed = 0.0005;
var cactus = [];
var col1, col2;
function setup() {
createCanvas(480,480);
frameRate(10);
//start landscape out with 3 cacti
for(i = 0; i < 3; i++){
var rx = random(0,width);
cactus[i] = makeCactus(rx);
}
}
function draw (){
//create gradient colors
c1= color(255, 149, 0);
c2= color(235, 75, 147);
setGradient(c1, c2);
//call functions
drawDesertMtn();
updateCactus();
removeCactus();
addCactus();
}
function setGradient(c1, c2){
//create the gradient background
noFill();
for(i = 0; i < height; i++){
var grad = map(i, 0, height, 0, 1);
var col = lerpColor(c1, c2, grad);
stroke(col);
line(0, i, width, i);
}
}
function drawDesertMtn(){
//back mtn
fill(255, 155, 84);
noStroke();
beginShape();
//make the terrain randomize and go off screen
for (var x = 0; x < width; x++) {
var t = (x * terrainDetail) + (millis() * terrainSpeed);
var y = map(noise(t), 0,2, 50, height);
vertex(x, y);
}
vertex(width,height);
vertex(0,height);
endShape();
//middle mtn
fill(245, 105, 98);
noStroke();
beginShape();
//make the terrain randomize and go off screen
for (var x = 0; x < width; x++) {
var t = (x * terrainDetail) + (millis() * terrainSpeed);
var y = map(noise(t), 0,1, 100, height);
vertex(x, y);
}
vertex(width,height);
vertex(0,height);
endShape();
//closest mtn
fill(224, 54, 139);
noStroke();
beginShape();
//make the terrain randomize and go off screen
for (var x = 0; x < width; x++) {
var t = (x * terrainDetail) + (millis() * terrainSpeed);
var y = map(noise(t), 0,1,200,height);
vertex(x, y);
}
vertex(width,height);
vertex(0,height);
endShape();
//groud
fill(165, 196, 106);
noStroke();
beginShape();
//make the ground randomize and go off screen
for (var x = 0; x < width; x++) {
var t = (x * groundDetail) + (millis() * groundSpeed);
var y = map(noise(t), 0, 1,400,480);
vertex(x, y);
}
vertex(width, height);
vertex(0,height);
endShape();
}
//change x value of cactus as cactus moves
function moveCactus(){
this.x += this.speed;
}
function makeCactus(cactusX){
//create the cactus as an object w some random parts
var cactus={
x:cactusX,
speed: -6,
breadth:311,
color: random(0,100),
length: random(50,100),
move: moveCactus,
display: displayCactus,
}
return cactus;
}
function updateCactus(){
//loop through an array of cactus to update as adding and moving
for(i = 0; i < cactus.length; i++){
cactus[i].move();
cactus[i].display();
}
}
function displayCactus(){
//create the cactus visuals with object parts
noStroke();
fill(this.color, 107, 9);
//translate to x value of new cactus
push();
translate(this.x+157, height-40);
ellipse(0,0,94,137);
fill(this.color, 107,9);
ellipse(61, -52, this.length,48);
fill(this.color, 115, 28);
ellipse(47,-83,19,27);
fill(90, 115, 22);
ellipse(81, -74, 24,24);
fill(90, 115, 22);
ellipse(-34, -86, this.length, 74);
fill(this.color, 115, 22);
ellipse(-18, -131, 41,41);
fill(252, 197, 247);
//create flower on cactus
beginShape();
curveVertex(-1, -150);
curveVertex(-7,-152);
curveVertex(-7, -147);
curveVertex(-10, -157);
curveVertex(-5, -141);
curveVertex(-4, -135);
curveVertex(1, -140);
curveVertex(8, -135);
curveVertex(8, -142);
curveVertex(8, -147);
curveVertex(3, -148);
curveVertex(3, -153);
curveVertex(-1, -150);
endShape();
pop();
}
function addCactus(){
//add a new cactus to the array
var newCactus = 0.01;
if(random(0,1)< newCactus){
cactus.push(makeCactus(width));
}
}
function removeCactus(){
//remove cactus from array as it goes off the screen
var keepCactus = [];
for(i = 0; i < cactus.length; i++){
if(cactus[i].x + cactus[i].breadth > 0){
keepCactus.push(cactus[i]);
}
}
cactus = keepCactus;
}
I was inspired by desert landscapes in which the sun is setting and there are cacti as well as communicate the vastness of a place like joshua tree.ca.
This week the female creator I decided to focus on is Yael Braha. She is a designer and creative director from Italy. She focuses a lot on large scale interactive projects and sculptures in her personal time. I was really inspired by her project Animal Race. This project was done for California Academy of Sciences in 2013.
This project is a very simple and effective data visualization. People can decided what animal they want to race and then in real time the race with a projected animation. The animation reflects the real speed of the animals so you can see if you are actually faster than a elephant for example. The data from the race is immediately displayed, stored and compared to all the other ‘runs’.
What I really like about this project is how it is so simple and so effective. She used Arduino, Processing, animation software, Resolume and electronics like a projector. It is so playful that people are drawn in and want to participate. It is also a teaching tool about data, data visualization and animals.
//Margot Gersing - Project 11 - mgersing@andrew.cmu.edu - section E
var stars = [];
var terrainSpeedOne = 0.0002; //dark green moutain speed
var terrainSpeedTwo = 0.0004; // water speed
var terrainSpeedThree = 0.0006; // ligth green ground speed
var terrainDetailOne = 0.008; //green moutian
var terrainDetailTwo = 0.001; //water
var terrainDetailThree = 0.005; //light green moutain
function setup() {
createCanvas(480, 480);
frameRate(20);
//fills stars array
for (var i = 0; i < 75; i ++){
var strX = random(width);
var strY = random(0, height / 2);
stars[i] = makeStars(strX, strY);
}
}
function draw() {
background(214, 197, 204);
//moon
fill(169, 47, 35);
ellipse(375, 100, 150, 150);
displayStars(); //stars
moutainTwo(); //background moutians
water(); //water
moutainThree(); //foreground
}
function moutainTwo() {
noStroke();
fill(22, 56, 32); //darkgreen
beginShape();
for(var x = 0; x < width; x++){
var t = (x * terrainDetailOne) + (millis() * terrainSpeedOne);
var y = map(noise(t), 0, 1, 300, 250);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
}
function water() {
noStroke();
fill(72, 90, 103); //blue
beginShape();
for(var x = 0; x < width; x++){
var t = (x * terrainDetailTwo) + (millis() * terrainSpeedTwo);
var y = map(noise(t), 0, 2, 400, 300);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
}
function moutainThree() {
noStroke();
fill(110, 135, 84); //light green
beginShape();
for(var x = 0; x < width; x++){
var t = (x * terrainDetailThree) + (millis() * terrainSpeedThree);
var y = map(noise(t), 0, 2, 500, 300);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
}
function drawStars(){ //what stars will look like
noStroke();
fill(201, 165, 180, 150);
push();
translate(this.x, this.y);
ellipse (1, 10, 5, 5);
pop();
}
function makeStars(strX, strY){ //stars object
var star = {x: strX,
y: strY,
speed: -1,
move: moveStars,
draw: drawStars}
return star;
}
function moveStars(){ //how stars move
this.x += this.speed;
if(this.x <= -10){
this.x += width;
}
}
function displayStars(){ //display stars
for(i = 0; i < stars.length; i++){
stars[i].move();
stars[i].draw();
}
}
For this project I decided to go with mountain landscapes. I had a good time messing with colors to create something a little different. I also generated stars in the sky. I decided to make the stars transparent so they were more subtle and you could see them pass over the moon. I also made the objects further back move slower so it would imitate what you see when you look out the window.
// Fanjie Mike Jin
// Section C
//fjin@andrew.cmu.edu
//Project-11
// global variables declared to hold objects
// array for tree objects
var trees = []
function setup() {
//color preprared for the gradient effect
c1 = color(250, 100, 0);
c2 = color(204, 143, 0);
createCanvas(480, 480);
frameRate(100);
}
function draw() {
//draw the gradient background
for (var i = 0; i < height; i++) {
var inter = map(i, 70, 110, 0, 1);
var c = lerpColor(c1, c2, inter);
stroke(c);
line(0, i, width, i);
}
//draw the sun in the background
noStroke();
fill(234, 120, 120, 200);
ellipse(100, 60, 90, 90);
fill(255, 146, 128, 200);
ellipse(100, 60, 76, 76);
mountainBackground(); //mountain
land()
updatetrees();
removetrees();
newtrees();
}
function updatetrees(){
// Update the x positions of the trees and display them
for (var i = 0; i < trees.length; i++){
trees[i].move();
trees[i].display();
}
}
function removetrees(){
//remove the building from the array once it dropped off the left edge
var treesToKeep = [];
for (var i = 0; i < trees.length; i++){
if (trees[i].x + trees[i].breadth > 0) {
treesToKeep.push(trees[i]);
}
}
// the exsiting trees will be kept
trees = treesToKeep;
}
function newtrees() {
// add a new tree to the end
var probability = 0.017;
if (random(0,1) < probability) {
trees.push(drawtrees(width));
}
}
//update position of tree every frame
function treesMove() {
this.x += this.speed;
}
//display the trees
function treesDisplay() {
noStroke();
//leaves
fill(50, 235, 173);
triangle(this.x - 15, 350, this.x + 15, 350, this.x, 320);
triangle(this.x - 20, 370, this.x + 20, 370, this.x, 330);
triangle(this.x - 30, 400, this.x + 30, 400, this.x, 350);
//trunk
stroke(194, 245, 228);
line(this.x, 350, this.x, 420);
}
function drawtrees(px) {
var dt = {x: px,
//trees obeject properties
breadth: 30,
speed: -1.0,
move: treesMove,
display: treesDisplay}
return dt;
}
function mountainBackground() {
//makes mountains in the back
terrain = 0.009;
terrain2 = 0.014;
terrainSpeed = 0.0003;
//use noise function to draw random background contour of the furthest mountains
stroke(30, 148, 143,200);
beginShape();
//make slowly rolling hills
for (var j = 0; j < width; j++) {
var t = (j * terrain) + (millis() * terrainSpeed);
var y2 = map(noise(t), 0, 1, 200, 10);
line(j, y2, j, height);
}
endShape();
//use noise function to draw random background contour of the closer mountains
stroke(65, 158, 155);
beginShape();
for (var j = 0; j < width; j++) {
var t = (j * terrain2) + (millis() * terrainSpeed);
var y2 = map(noise(t), 0, 1, 400, 10);
line(j, y2, j, height);
}
endShape();
}
function land() {
//makes the land in the foreground appear
fill(46, 84, 78);
rect(0, 420, 480, 130);
}
When I thought about the “generative landscape”, the first idea that prompted my mind is a landscape with mountains and trees. There are two layers of mountains to show the depth of this generative landscape. There are pine trees in the foreground. I have chosen the colors strategically so that the whole composition can be read clearly and aesthetically pleasing.
History Flow is a data visualization project by Fernanda Viégas, a senior researcher at Google with a focus on human/AI interaction and data visualization. The project History Flow shows study collaboration patterns on Wikipedia and was on display at the MoMA in New York City. To show such patterns on Wikipedia, Viégas collected the entire past editorial data from various different wikipedia pages and input this data into a script in order to create a legible graphic representation. The resulting visualizations make use of color, patterns, and direction to represent various different events and trends within each page’s history and tell a story about that particular topic from the perspective of all its contributed combined.
I found the project to be a really compelling data visualization with an especially unique focus on something I never would have imagined being visualized. The final images tell interesting stories and show the overall interest / controversial nature about their respective topics.
// Paul Greenway
// pgreenwa
// pgreenwa@andrew.cmu.edu
// Project-11-Landscape
var terrainSpeed = 0.0005;
var terrainDetail = 0.005;
var buildings = [];
var trees = [];
var c1;
var c2;
function setup() {
createCanvas(480, 300);
//gradient background color set
c1 = color(0, 90, 186);
c2 = color(255, 166, 0);
setGradient(c1, c2);
// create an initial collection of buildings
for (var i = 0; i < 20; i++){
var rx = random(width);
buildings[i] = makeBuilding(rx);
}
frameRate(60);
}
function draw() {
setGradient(c1, c2);
mountains1();
mountain2();
strokeWeight(1);
updateAndDisplayBuildings();
removeBuildingsThatHaveSlippedOutOfView();
addNewBuildingsWithSomeRandomProbability();
updateAndDisplayTrees();
removeTreesThatHaveSlippedOutOfView();
addNewTreesWithSomeRandomProbability();
fill(40);
rect (0,height-60, width, height-50);
noFill();
stroke(255);
strokeWeight(1);
line(0,height-40, width, height-40);
strokeWeight(3);
line(0,height-30, width, height-30);
noStroke();
fill(255);
ellipse(500,50,30,30);
}
//create background mountains
function mountains1() {
noStroke();
fill(255,100);
beginShape();
for (var x = 0; x < width; x++) {
var t = (x * terrainDetail*3) + (millis() * terrainSpeed);
var y = map(noise(t), 0, 1, height/4, height/2);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
}
function mountain2() {
noStroke();
fill(185, 96, 0, 100);
beginShape();
for (var x = 0; x < width; x++) {
var t = (x * terrainDetail*3) + (millis() * terrainSpeed);
var y = map(noise(t), 0, 1, height/1.5, height/2);
vertex(x, y);
}
vertex(width, height);
vertex(0, height);
endShape(CLOSE);
}
//set background color gradient
function setGradient(c1, c2) {
noFill();
for (var y = 0; y < 300; y++) {
var inter = map(y, 0, 150, 0, 1);
var c = lerpColor(c1, c2, inter);
stroke(c);
line(0, y, width, y);
}
}
//create windy trees
function updateAndDisplayTrees(){
for (var i = 0; i < trees.length; i++){
trees[i].move();
trees[i].display();
}
}
function removeTreesThatHaveSlippedOutOfView(){
var treesToKeep = [];
for (var i = 0; i < trees.length; i++){
if (trees[i].x + trees[i].breadth > 0) {
treesToKeep.push(trees[i]);
}
}
trees = treesToKeep; // remember the surviving buildings
}
function addNewTreesWithSomeRandomProbability() {
// With a very tiny probability, add a new building to the end.
var newTreeLikelihood = 0.01;
if (random(0,1) < newTreeLikelihood) {
trees.push(makeTree(width));
}
}
function treeMove() {
this.x += this.speed;
}
function treeDisplay() {
var treeHeight = random(45,50);
var tHeight = treeHeight;
fill(0,100);
noStroke();
push();
translate(this.x, height - 40);
ellipse(0, -tHeight, this.breadth-10, tHeight);
fill('black');
rect(0-4,-tHeight, this.breadth-45, tHeight);
pop();
}
function makeTree(birthLocationX) {
var tre = {x: birthLocationX,
breadth: 50,
speed: -1.0,
nFloors: round(random(2,8)),
move: treeMove,
display: treeDisplay}
return tre;
}
//create buildings based on starter code
function updateAndDisplayBuildings(){
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.005;
if (random(0,1) < newBuildingLikelihood) {
buildings.push(makeBuilding(width));
}
}
function buildingMove() {
this.x += this.speed;
}
function buildingDisplay() {
var floorHeight = 20;
var bHeight = this.nFloors * floorHeight;
fill(100,200);
noStroke();
push();
translate(this.x, height - 40);
rect(0, -bHeight, this.breadth, bHeight);
noStroke();
fill(255);
for (var i = 0; i < this.nFloors; i++) {
ellipse(3+5,-10+20*-i,5,5);
}
for (var y = 0; y < this.nFloors; y++) {
ellipse(13+5,-10+20*-y,5,5);
}
for (var z = 0; z < this.nFloors; z++) {
ellipse(23+5,-10+20*-z,5,5);
}
for (var x = 0; x < this.nFloors; x++) {
ellipse(33+5,-10+20*-x,5,5);
}
pop();
}
function makeBuilding(birthLocationX) {
var bldg = {x: birthLocationX,
breadth: 50,
speed: -1.0,
nFloors: round(random(2,8)),
move: buildingMove,
display: buildingDisplay}
return bldg;
}
For this project I wanted to create the view of a landscape as seen when driving in a car. I made use of the base passing buildings object as well as adding trees, mountains, and a gradient sky color to create the overall composition.
// Timothy Liu
// 15-104, Section C
// tcliu@andrew.cmu.edu
// OpenProject-11
var cowArray = []; // array for all cows
var birdArray = []; // array for all birds
// variables to control the shape and speed of the rows of trees
var backTreesStructure = 0.04;
var backTreesSpeed = 0.0009;
var frontTreesStructure = 0.04;
var frontTreesSpeed = 0.0009;
// hill in the front
var rollingPlain = 0.005;
var rollingPlainSpeed = 0.0001;
function setup() {
createCanvas(600, 240);
// start with 3 cows on the screen
for (var i = 0; i < 3; i++){
var cowPlacement = random(0, width);
cowArray[i] = cowObj(cowPlacement); // places the 3 cows in random locations
}
// draws in birds; start with 5 on the screen
for (var j = 0; j < 5; j++) {
birdArray.push(birdObj(j * 30 + random(40, width - 40),
random(20, 60), random(10, 25))); // gives the birds random x, y, and size
}
frameRate(40);
}
function draw() {
background(124, 196, 230); // sky color
drawTrees(); // draw the two rows of trees first (in the background)
updateAndShowCows(); // draw and have the cows move
updateCowsOffScreen(); // account for when cows move off screen
updateAndShowBirds(); // draw and have the birds move
updateBirdsOffScreen(); // account for when birds move off screen
newCows(); // draws in new cows (from edge of screen)
newBirds(); // draws in new birds (from edge of screen)
}
function drawTrees() {
// the back (darker) row of trees
beginShape();
fill(40, 120, 61);
noStroke();
vertex(0, height);
// use noise function to draw random tree line
for (var x = 0; x < width; x++) {
var t = (x * backTreesStructure) + (millis() * backTreesSpeed);
var y = map(noise(t), 0, 1, 40, 150);
vertex(x, y);
}
vertex(width, height);
endShape();
// the front (lighter) row of trees
beginShape();
fill(50, 168, 82);
noStroke();
vertex(0, height);
//use noise function to draw random, lower tree line to create depth
for (var x = 0; x < width; x++) {
var t = (x * frontTreesStructure) + (millis() * frontTreesSpeed);
var y = map(noise(t * 0.7), 0, 1, 80, 200);
vertex(x, y);
}
vertex(width, height);
endShape();
// the light-green hills in front
beginShape();
fill(154, 196, 118);
noStroke();
vertex(0, height);
// use a dampened version of the noise function to make slowly rolling hills
for (var x = 0; x < width; x++) {
var t = (x * rollingPlain) + (millis() * rollingPlainSpeed);
var y = map(noise(t * 0.5), 0, 1, 170, 200);
vertex(x, y);
}
vertex(width, height);
endShape();
}
// puts the cows on the canvas and makes them move
function updateAndShowCows(){
for (var i = 0; i < cowArray.length; i++){
cowArray[i].move(); // move property of the cow obj
cowArray[i].show(); // show property of the bird obj
}
}
// puts the birds on the canvas and makes them move
function updateAndShowBirds(){
for (var i = 0; i < birdArray.length; i++){
birdArray[i].moveB(); // move property of the bird obj
birdArray[i].showB(); // show property of the bird obj
}
}
// eliminates the cows that move off screen
function updateCowsOffScreen(){
var cowsToKeep = []; // to determine which cows are still on screen
for (var i = 0; i < cowArray.length; i++) {
if (cowArray[i].x + cowArray[i].cowWidth > 0) { // if the cow is still on the screen
cowsToKeep.push(cowArray[i]); // put it into the new array
}
}
// cowsToKeep[] becomes the new array of cows currently on screen
cowArray = cowsToKeep;
}
// eliminates the birds that move off screen
function updateBirdsOffScreen(){
var birdsToKeep = []; // to determine which birds are still on screen
for (var i = 0; i < birdArray.length; i++) {
if (birdArray[i].bx + birdArray[i].sizeOfBird > 0) { // if the bird is still on the screen
birdsToKeep.push(birdArray[i]); // put it into the new array
}
}
// birdsToKeep[] becomes the new array of birds currently on screen
birdArray = birdsToKeep;
}
// occasionally, add a new cow to the end of the screen
function newCows() {
var newCowOdds = 0.008;
if (random(0, 1) < newCowOdds) {
cowArray.push(cowObj(width)); // add a new cow to the array
}
}
// occasionally, add a new bird to the end of the screen
function newBirds() {
var newBirdOdds = 0.008;
if (random(0, 1) < newBirdOdds) {
birdArray.push(birdObj(width, random(20, 50), random(10, 25))); // add a new bird to the array
}
}
// makes the cows move
function movingCows() {
this.x += this.speed;
}
// makes the birds move
function movingBirds() {
this.bx += this.speedBird;
}
// this is what actually draws in, and displays, the cows using various cow object properties
function showCows() {
var cowPlacement = this.randomLoc;
var earOffset = 7;
var headOffset = 15;
var eyeOffset = 10;
var spot2Offset = 5;
var spot3Offset = 4;
var snoutOffset = 6;
push();
translate(this.x, height); // places the cows onto the canvas
// shadow
noStroke();
fill(7, 66, 25);
ellipse(0, -cowPlacement + 10, this.cowWidth, this.cowHeight / 4);
// cow body
fill(this.randomColor);
arc(0, -cowPlacement, this.cowWidth, this.cowHeight * 0.75, 2 * PI / 3, PI / 3, CHORD);
// cow ears
arc(-headOffset - earOffset, -cowPlacement - headOffset, this.earW, this.earW * 0.75, 4 * PI / 3, PI / 3, CHORD);
arc(-headOffset + earOffset, -cowPlacement - headOffset, this.earW, this.earW * 0.75, 2 * PI / 3, 5 * PI / 3, CHORD);
// cow head
ellipse(-headOffset, -(cowPlacement + eyeOffset), this.cowHead * 1.25, this.cowHead);
// three spots
fill(0);
ellipse(this.spot1, -cowPlacement, this.spotW, this.spotH);
ellipse(this.spot2, -cowPlacement + spot2Offset, this.spotW * 1.2, this.spotH);
ellipse(this.spot3, -cowPlacement - spot3Offset, this.spotW, this.spotH * 1.2);
// eyes
ellipse(-18, -cowPlacement - eyeOffset, this.eye, this.eye * 1.2);
ellipse(-12, -cowPlacement - eyeOffset, this.eye, this.eye * 1.2);
// snout
fill("#eba4dd");
ellipse(-15, -(cowPlacement + snoutOffset), this.snout * 1.6, this.snout);
pop();
}
// this is what actually draws in, and displays, the birds using various bird object properties
function showBirds() {
var birdBod = 5; // body size of bird
noFill();
stroke(0);
strokeWeight(2);
push();
// places and sizes the birds
translate(this.bx, this.by);
scale(this.sizeOfBird / 60);
ellipseMode(CENTER);
// uses arcs and ellipses to draw the wings and body
arc(35, 35, 100, 100, 5 * PI / 4, 3 * PI / 2);
arc(-35, 35, 100, 100, 3 * PI / 2, 7 * PI / 4);
fill(0);
ellipse(0, 0, birdBod, birdBod);
pop();
}
// here are all the properties of the cow object
function cowObj(x) {
let colors = ["#8f6846", "#ffffff", "#918880"] // different colors of cows
// cow obj properties
var cow = {x: x,
cowWidth: random(30, 40), // each cow has a diff size and shape
cowHeight: random(25, 40),
cowHead: random(10, 16),
snout: 7,
spot1: random(-12, -8),
spot2: random(1, 5),
spot3: random(5, 10),
eye: 3,
earW: 8,
spotW: 8,
spotH: 6,
speed: random(-3, -1), // each cow moves at a diff speed
move: movingCows,
show: showCows,
randomLoc: random(35, 60),
randomColor: random(colors), // each cow has a different color
}
return cow;
}
// here are all the properties of the bird object
function birdObj(x, y, size) {
// bird obj properties
var bird = {bx: x,
by: y,
sizeOfBird: size, // each bird has a random size
speedBird: random(-4, -1), // each bird has a random speed
showB: showBirds,
moveB: movingBirds
};
return bird;
}
When I thought about the “generative landscape” prompt for this week’s assignment, one of the first things that came to mind was the scenery during the long road trips my family takes every year from the Bay Area to Southern California. I distinctly remember staring out the window as a kid, watching cows idly graze in fields and the rolling trees and hills zoom by as we drove down I-5. Thus, I wanted to model my project after this landscape because it’s a very fond childhood memory of mine.
In my generative landscape, I have cows of all sorts of shapes, colors, and sizes on grassy plains as the screen pans leftward. In the background, rows of trees and grassy hills roll by, and birds fly overhead at varying speeds. My piece is meant to represent an idyllic view of what a kid sees when they stare out the window on a road trip through California’s central valley. The blue sky, the flocking birds, and the vast greenery all convey warmth and happiness. Ultimately, I think it’s the motion and dynamism of my piece that really help capture the feeling of blissfulness.
I have always been interested in games so I was drawn to Chloe Varelidi’s repertoire when looking through the list provided. This particular project is interesting experiment in shared learning and game design. Games are an excellent way to get people interested in art, coding, and design principals. This collaborative method of making and sharing mini-games is an excellent way for people to begin their exploration of games, art, and code.
Collaboration is another well done element of this project. There is a focus on working and learning together so that a greater thing can be made. Each mini game may only be a couple minutes long, but in total, this project could create hours and hours of entertaining content for people to make and share.