Erica Esserman

Go to Work

Project Type: VR Stereoscopic Experience/Performance

Date: 2018

Role: Independent Project

Technology: Processing, Minoru Stereoscopic Camera, Adobe Premiere

Location: University of California, San Diego, San Diego, California, United States

PROJECT DESCRIPTION

Go to Work is a 3D (stereoscopic) “Choose Your Own Adventure” journey.  The stereoscopic footage is shot POV style from 5 different intersecting lives (as of now, but more individuals will be added).  The viewer begins the journey by putting on a custom-built “Work Helmet” and wakes up as a new person.  At the end of the day, the viewer is given the option to either sleep or go to work.  If “Go to Sleep” is chosen, the viewer wakes up as the same individual.  If “Go to Work” is chosen, footage of the current person putting on another Work Helmet is shown, and the viewer wakes up as a new individual.  Throughout the experience, the option to “Quit This Job” is always shown at the bottom.  If the viewer quits the job, he or she wakes up as the previous person in the adventure.  If enough jobs are quit, the viewer is told to take off the helmet they are wearing and return to this timeline.

The first performance of this piece also included a 4D experience in which the person wearing the helmet was prompted to open her mouth when the person she was currently experiencing brought a cookie up to his mouth.  At this time, an actual cookie was fed to the participant.

 

ARTIST’S STATEMENT

Far into the future due to ever-advancing technology, we will no longer need to work.  All resources we could ever want will be wildly abundant, and we will have anything imaginable at our fingertips.  It will become boring to simply exist in this future world.  Humans need to keep busy, stay challenged, and always continue grow.  The next frontier to explore will be the experiences of other people. Eventually, VR will become so advanced, we will not be able to tell the difference between this reality and a virtual one.  If that statement is plausible, then the notion that our current reality may be the result of the creation of a virtual reality so advanced it is almost undetectable is also plausible.  Perhaps we are living in our future’s VR creation right now– keeping our awareness busy working away as a human…always learning, always growing, gathering a whole new perspective on the world one life at a time.

 

METHOD, MATERIALS, AND RESOURCES

This project was built using Processing and written in Java.  The film was recorded using the Minoru stereoscopic webcam with custom additions to allow it to be used as a headcam.  All footage was edited using Adobe Premiere Pro.  The work helmet is custom-made using metal, a cardboard VR viewer, and fabric.

				
					CODE
[cc lang="java"]
import processing.video.*;
//initialize variables;
Movie [] movieArrayBed = new Movie[6];
Movie [] movieArraySleep = new Movie[6];
Movie [] movieArrayWork = new Movie[6];
String [] nameArray = new String[6];
//float [] bedST = new float[movArraySize];
boolean canClickSTART = true;
boolean canClick = false;
boolean canClickQUITJOB = false;
boolean goToWork = false;
boolean quitJob = false;
boolean goToSleep = false;
boolean lastVideo = false;
int i = -1;
int f = 2;
int s = 1;
PFont phageRough24;
PFont phageRough18;
PFont phageRough14;
float width = 1000;
float height = 700;
float centerVidLW = (width/2)-(320/2);
float centerVidLH = (height * .5);
float centerVidRW= ((width/2) + (320/2) );
float centerVidRH = (height * .5);
StopWatchTimer sw = new StopWatchTimer();
void setup() {
size(1000, 700); //for comp
//fullScreen(); //for phones
background(0);
// Create the font
phageRough24 = createFont("Phage Rough", 24);
textFont(phageRough24);
phageRough18 = createFont("Phage Rough", 18);
phageRough14 = createFont("Phage Rough", 14);
//add all movie files and names
//nameArray[] = new String("");
//movieArrayBed[] = new Movie(this, "Wake.mp4");
//movieArrayWork[] = new Movie(this, "Work.mp4");
//movieArraySleep[] = new Movie(this, "Sleep.mp4");
nameArray[0] = new String("Erica");
movieArrayBed[0] = new Movie(this, "EricaWake.mp4");
movieArrayWork[0] = new Movie(this, "EricaWake.mp4");
movieArraySleep[0] = new Movie(this, "EricaWake.mp4");
nameArray[1] = new String("Jeff");
movieArrayBed[1] = new Movie(this, "JeffWake.mp4");
movieArrayWork[1] = new Movie(this, "JeffWork.mp4");
movieArraySleep[1] = new Movie(this, "JeffSleep.mp4");
nameArray[2] = new String("Erica");
movieArrayBed[2] = new Movie(this, "EricaWake.mp4");
movieArrayWork[2] = new Movie(this, "EricaWork.mp4");
movieArraySleep[2] = new Movie(this, "EricaSleep.mp4");
nameArray[3] = new String("Robert");
movieArrayBed[3] = new Movie(this, "RobertWake.mp4");
movieArrayWork[3] = new Movie(this, "RobertWork.mp4");
movieArraySleep[3] = new Movie(this, "RobertSleep.mp4");
nameArray[4] = new String("Annie");
movieArrayBed[4] = new Movie(this, "AnnieWake.mp4");
movieArrayWork[4] = new Movie(this, "AnnieWork.mp4");
movieArraySleep[4] = new Movie(this, "AnnieSleep.mp4");
nameArray[5] = new String("Artie");
movieArrayBed[5] = new Movie(this, "ArtieWake.mp4");
movieArrayWork[5] = new Movie(this, "ArtieWork.mp4");
movieArraySleep[5] = new Movie(this, "ArtieSleep.mp4");
//movieArrayWork[i].play();
}
void movieEvent(Movie m) {
m.read();
}
void draw() {
noStroke();
textAlign(CENTER);
imageMode(CENTER);
background(0);
stroke(255);
fill(255);
textFont(phageRough24);
if (i == -1) {
text("PUT ON WORK HELMET",centerVidLW ,centerVidLH);
text("PUT ON WORK HELMET",centerVidRW ,centerVidRH);
fill(255);
textFont(phageRough18);
text("PRESS HERE TO START",centerVidLW ,centerVidLH+100);
text("PRESS HERE TO START",centerVidRW ,centerVidRH+100);
fill(255,255,255,0);
stroke(255);
rectMode(CENTER);
rect(centerVidRW ,centerVidRH+93, 280, 30);
rect(centerVidLW ,centerVidLH+93, 280, 30);
rect(centerVidRW ,centerVidRH, 320, 240);
rect(centerVidLW ,centerVidLH, 320, 240);
}
if ((i >1 )&& (i%6 == 0)) {
i++;
}
if (i == 0) {
text("TAKE OFF HELMET",centerVidLW ,centerVidLH);
text("TAKE OFF HELMET",centerVidRW ,centerVidRH);
}
if (i > 0) { //person loop while i is greater than 0 (person 0 is the ending video)
//if (movieArrayBed[i].time() == 0) { //start the movie if it is the first time
movieArrayBed[i%6].play();
//}
background(0);
imageMode(CENTER);
image(movieArrayBed[i%6], width/2 ,height/2, 640, 240); //show the bed movie
fill(255);
text("Your Name: " + nameArray[i%6] ,240 ,225);
float md = movieArrayBed[i%6].duration(); //for PC
float mt = movieArrayBed[i%6].time(); //for PC
if ((md - mt < 5.0) && (i%6 < 5)) { //if the movie has 5 seconds left, show choice overlays
canClick = true; // sets the ability to click
//left choice bg
fill(255,0,0,127);
rectMode(CENTER);
rect( (width/2), height/4, width, height/2);
//right choice bg
fill(0,0,255,127);
rectMode(CENTER);
rect( (width/2), (height/4 + height/2), width, height/2);
fill(0);
//left choice text
textAlign(CENTER);
fill(255);
textFont(phageRough24);
text("GO TO WORK",centerVidLW ,centerVidLH-40);
text("GO TO WORK",centerVidRW ,centerVidRH-40);
fill(255);
textFont(phageRough18);
text("GO TO SLEEP",centerVidLW ,centerVidLH+60);
text("GO TO SLEEP",centerVidRW ,centerVidRH+60);
if (md - mt < 1.0) {
movieArrayBed[i%6].pause();
}
} //end show choice overlay
if ((md - mt < 1.0) && (i%6 == 5)) { //if the movie has 1 seconds left, show choice overlays
if (s ==1) {
sw.start();
s=2;
}
canClick = true; // sets the ability to click
//left choice bg
fill(255,0,0,127);
rectMode(CENTER);
rect( (width/2), height/4, width, height/2);
//right choice bg
fill(0,0,255,127);
rectMode(CENTER);
rect( (width/2), (height/4 + height/2), width, height/2);
fill(0);
//left choice text
textAlign(CENTER);
fill(255);
textFont(phageRough24);
text("GO TO WORK",centerVidLW ,centerVidLH-40);
text("GO TO WORK",centerVidRW ,centerVidRH-40);
fill(255);
textFont(phageRough18);
text("GO TO SLEEP",centerVidLW ,centerVidLH+60);
text("GO TO SLEEP",centerVidRW ,centerVidRH+60);
if (md - mt < 1.0) {
movieArrayBed[i%6].pause();
}
if (sw.second() < 6) {
background(0);
fill(0);
fill(255);
textFont(phageRough18);
text("OPEN MOUTH",centerVidLW ,centerVidLH);
text("OPEN MOUTH",centerVidRW ,centerVidRH);
}
} //end show choice overlay
//user makes choice during "canClick=True"
if (goToSleep == true) { //sleep choice made
canClick = false;
movieArrayBed[i%6].stop();
movieArraySleep[i%6].play();
image(movieArraySleep[i%6], width/2 ,height/2, 640, 240);
fill(255);
fill(255);
textAlign(CENTER);
textFont(phageRough24);
text("GOODNIGHT", centerVidLW ,centerVidLH);
text("GOODNIGHT", centerVidRW ,centerVidRH);
float mddd = movieArraySleep[i%6].duration();
float mttt = movieArraySleep[i%6].time();
if (mddd - mttt < 1.0) {
movieArraySleep[i%6].stop();
goToSleep = false; //start loop with this value set at false
}
}//end goToSleep True
if (goToWork == true) { //bed choice made
movieArrayBed[i%6].stop();
movieArrayWork[i%6].play();
canClick = false;
image(movieArrayWork[i%6], width/2 ,height/2, 640, 240); //show the gotoWork movie
fill(255);
float mdd = movieArrayWork[i%6].duration();
float mtt = movieArrayWork[i%6].time();
if (mdd - mtt < 1.0) { movieArrayWork[i%6].stop(); i++; //increase to next person goToWork = false; //start loop with this value set at false } } //end{} if gotowork = true if (quitJob == true) { movieArrayWork[i%6].stop(); movieArrayBed[i%6].stop(); movieArraySleep[i%6].stop(); if ((i>5) && (i%6==1)) {
i = i-2;
}
else {i--; }//go to previous person
quitJob = false;
}//end quitJob True
canClickQUITJOB = true;
fill(0);
stroke(255);
rect(centerVidRW ,centerVidRH+130, 140, 30);
rect(centerVidLW ,centerVidLH+130, 140, 30);
fill(255);
textFont(phageRough18);
text("QUIT THIS JOB",centerVidLW ,centerVidLH+136);
text("QUIT THIS JOB",centerVidRW ,centerVidRH+136);
}//end person for loop
}//draw()
void mouseClicked() {
if ((mouseY < centerVidRH+150) && (mouseY > centerVidRH+100) && (canClickQUITJOB == true)) {
quitJob = true;
}
if ((mouseY > height / 2) && (canClick == true)) {
goToSleep = true;
}
if ((mouseY < height / 2) && (canClick == true)) { goToWork = true; } if ((mouseY > centerVidRH+95-25) && (mouseY < centerVidRH+95+25) && (canClickSTART == true)) {
i = 1;
canClickSTART = false;
movieArrayBed[i].play();
}
} //end mouseClicked()
class StopWatchTimer {
int startTime = 0, stopTime = 0;
boolean running = false;
void start() {
startTime = millis();
running = true;
}
void stop() {
stopTime = millis();
running = false;
}
int getElapsedTime() {
int elapsed;
if (running) {
elapsed = (millis() - startTime);
}
else {
elapsed = (stopTime - startTime);
}
return elapsed;
}
int second() {
return (getElapsedTime() / 1000) % 60;
}
int minute() {
return (getElapsedTime() / (1000*60)) % 60;
}
int hour() {
return (getElapsedTime() / (1000*60*60)) % 24;
}
}
[/cc]