Go To Work

DSC03455

PROJECT DESCRIPTION

Go to Work provides the viewer 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.

Minoru USB Webcam

Stereoscopic USB Webcam

Processing (Java Mode)

Work Helmet

Metal, VR cardboard, fabric, Posca Paint

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];
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);
 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");
}
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
 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;
 }
}

CHALLENGES AND FUTURE DEVELOPMENTS

One of the greatest challenges in this project was developing a working application for both the VR viewer on Android and for PC in order to present the project to a large group at the same time. The video library for Processing is not compatible with Processing for Android, so my workaround, for now, was to mirror my computer screen on an Android device.  There was a lack of compatible video libraries for Processing for Android. In future iterations of this project, I plan to either move to Android Studio and develop a full app for the adventure or rewrite the code in p5.js and embed it online for viewing (though I haven’t found a way to successfully utilize video with embedded p5.js yet).

Another large challenge was the low video quality and processing abilities of the Minoru USB webcam.  Though it worked great as an introduction to stereoscopic filming as it was simple to set up and calibrate (it even came with its own software for doing so), many shots were not usable especially in moderately low light or shots with even moderate motion. Ideally, HD or 4k footage will be used as well as a video stabilizer.  I also plan to incorporate 360-degree video to further the immersion. The last development of this project will include increased choices within each individual, so the viewer will have more options every time they wake up.

Want to get in touch?

Contact me here with your questions or ideas!


Click Here

Leave a Reply

Your email address will not be published. Required fields are marked *