Xing Xu-LookingOutwards-1

by xing @ 6:33 am 24 January 2012

cubelets

Cubelets are magnetic blocks that can be snapped together to make an endless variety of robots with no programming and no wires. You can build robots that drive around on a tabletop, respond to light, sound, and temperature, and have surprisingly lifelike behavior. But instead of programming that behavior, you snap the cubelets together and watch the behavior emerge like with a flock of birds or a swarm of bees.
it is a new modular and tactical way to teach kids to learn how the idea of electronics and  logic.
If the look is gonna have a cuter and softer touch, it is more likable for kids.
[vimeo=https://vimeo.com/user5176324/cubelets]
http://www.modrobotics.com/

still life
Still Life by Scott Garner is an interactive wall piece that takes traditional still life painting and ads a motion-sensitive frame on a rotating mount.
Thought painting as a format of traditional art, it is truly interesting to combine the new technology to interact with the painting.
If it is possible, we could add more interaction to it not only the physic system in the “still life”
[vimeo=https://vimeo.com/35109750]

The Warhol: D.I.Y. POP
Create your own digital silkscreen print, just like Andy Warhol would have with the Warhol: D.I.Y. POP app from The Andy Warhol Museum.
It allows the guest to reproduce the artwork and to learn the process of making the artwork is very important.
It could has a better sense of aesthetics.

Pop app

Duncan Boehle – FaceOSC

by duncan @ 6:27 am

[youtube=https://www.youtube.com/watch?v=MIyjMMm55Xo]

 

For this project, I adapted a previously-existing game (a couple friends and I made it during a 24-hour game jam) to handle controls using FaceOSC.

The game is based around manipulating gravity in order to jump on platforms and push blocks to reach the end of each puzzle room. The character is controlled using the arrow keys, and if the player wants to change the direction of gravity, he/she must first pause the game, then select the direction with an arrow key. In order to prevent the second use of arrow keys and the delay, I use FaceOSC to detect the orientation of the player’s face in order to determine what direction they want gravity to pull.

Unfortunately, there are some puzzles that require precise timing, and rotating the head can easily lose FaceOSC’s tracking, which can only be reacquired if the face isn’t rotated. I found that during testing, it did help players to have the pause feature so they could avoid rapidly tilting their head, so in keeping with the FaceOSC theme, I pause gravity if the player raises his/her eyebrows. FaceOSC tracks eyebrows surprisingly quickly and accurately, so this gives the player much more precise control.

The game works fairly well with the face tracking, but unfortunately Flash cannot directly communicate with FaceOSC. Because Flash doesn’t accept the UDP traffic that OSC is based on, I needed to set up an intermediate server (in Java: http://benchun.net/flosc/) to receive the UDP packets from FaceOSC and send them along to Flash via TCP on an XMLSocket. This ultimately means that I would need to distribute both FaceOSC and the Java server to players, make sure their Flash networking security settings are correct, and make sure they can run the command line Java server. For the moment, it remains mostly experimental, but a project trying to achieve this mechanic with a better distribution model would be better off statically linking with OpenCV’s face detection.

Go here to play the original version of the game (without face tracking).

Ju Young Park – LookingOutwards

by ju @ 6:16 am

 

[youtube=https://www.youtube.com/watch?v=eKtnPOB0VoY]

 

Lee Lee Nam is a South Korean Media Artist, who uses technology in order to create moving image arts. He tends to use already known images, especially Korean traditional drawings in his works. He makes small objects in famous paintings or drawings live by animating them around canvas of screen. He believes that video art could express imagination. I personally love his works, especially projects about traditional Asian folding screens. Currently, he holds over 200 exhibitions in areas like New York, Beijing, Germany, Washington, and etc. I hope him to make his  works more interactive with audience in such a way that viewers can interact with  his works by touching or sensing them.

One of my favorite projects of his is starting at 2:43 from the video.

 

 

 

[youtube=https://www.youtube.com/watch?v=wrfJ9EOSFEU]

 

Pillow Talk is a project created by a small company, Little Riot. It is an interactive design project that connects long distance lovers. Each person has a ring sensor they wear to bed at night, and a flat fabric panel which slots inside their pillowcase. The ring wirelessly communicates with the other person’s pillow; when one person goes to bed, their lover’s pillow begins to glow softly to indicate their presence. I find this project interesting since two different users in different locations could interact at the same time. I think it is attractive how this project goes beyond the concept of space. However, I still think the project has a lot to work on more. I think it could improve more if each person can write on each pillow and chat through the pillow while in bed. I personally find this way more interesting.

You can read more HERE 

 

 

[vimeo=https://vimeo.com/5190335]

 

Many people might already know this project, Sound Playground. I’ve already known this project, but I would like to post it anyway since I find this really interesting. Sound Playground is a musical interactive project by Aesthetec.  The project conveys hundred LEDs, touch sensors, and Ethernet controllers for museum application. The project allows audience to actively interact with technology and music. By just touching installations, audience can create unique rhythms, volumes, and melody.  The project itself interprets as a new form of musical instruments. I am interested in technology-music projects like this one, and I hope to create something alike Sound Playground in future.

Sarah Keeling; FaceOSC

by sarah @ 5:04 am

For my FaceOSC project I wanted to do something that interacted with video. I thought it could be an interesting experience if while you were watching a movie, your facial reactions in response to the movie affected how it played. My version is a bit glitchy and there are some parts commented out that I would really have liked to get working. So far what I have is: the location of the “face” controls the speed and direction which the video is played back, opening the mouth draws a rectangle of color over the entire screen from a pixel from the movie file and by raising the eyebrows the movie is paused. (Unfortunately this is really hard to see on the video but it does work!) I found a really interesting piece of code on the Processing Forums that was using incoming video stream and mousePressed to ripple the video and was hoping to get this same effect by blinking the eyes, but I’m still working on getting this part running. Also, I was trying to get other clips to works such as the the famous shower scene from “Psycho”, but I’m still working on them too.

Sorry, the second link is a bit long (and crappy) but it shows the mouth variables.

//SarahKeeling's FaceOSC project for Golan Levin's IACD, CMU Spring 2012
// a template for receiving face tracking osc messages from
// Kyle McDonald's FaceOSC https://github.com/kylemcdonald/ofxFaceTracker
//
// this example includes a class to abstract the Face data
//
// 2012 Dan Wilcox danomatika.com
// for the IACD Spring 2012 class at the CMU School of Art
//
// adapted from from Greg Borenstein's 2011 example
// http://www.gregborenstein.com/
// https://gist.github.com/1603230
//

import processing.video.*;
Movie myMovie;

import oscP5.*;
OscP5 oscP5;

// our FaceOSC tracked face dat
Face face = new Face();

void setup() {
  size(600, 600);
  frameRate(30);

  oscP5 = new OscP5(this, 8338);

  //myMovie =new Movie (this, "lenlye_colourbox.mov");
  //myMovie =new Movie (this, "testVid.mov");
  //myMovie =new Movie (this, "psycho_showerscene_evensmaller.mov");
  //myMovie =new Movie (this, "vimeo_abstract_sm.mov");
  //myMovie =new Movie (this, "NotWhatIPaidFor.mov");

  myMovie.play ();

  loadPixels ();
  myMovie.loadPixels ();
}

void draw() {  
  background(255);

  image (myMovie, 0, 0);

  float newSpeed = map (face.posePosition.x, 0, 600, -1.0, 2.0);

  myMovie.speed (newSpeed);

  if (face.eyebrowLeft > 8.4) {
    myMovie.pause ();
  }
  else {
    myMovie.play ();
  }

  if (face.mouthHeight > 2) {
    int col;
    col = myMovie.get (50, 50);
    noStroke ();
    fill (col);
    rect (20, 20, myMovie.width, myMovie.height);
  }


  /*
  if(face.found > 0) {
   translate(face.posePosition.x, face.posePosition.y);
   scale(face.poseScale);
   noFill();
   ellipse(-20, face.eyeLeft * -9, 20, 7);
   ellipse(20, face.eyeRight * -9, 20, 7);
   ellipse(0, 20, face.mouthWidth* 3, face.mouthHeight * 3);
   ellipse(-5, face.nostrils * -1, 7, 3);
   ellipse(5, face.nostrils * -1, 7, 3);
   rectMode(CENTER);
   fill(0);
   rect(-20, face.eyebrowLeft * -5, 25, 5);
   rect(20, face.eyebrowRight * -5, 25, 5);
   */
  print(face.toString());
}


// OSC CALLBACK FUNCTIONS

void oscEvent(OscMessage m) {
  face.parseOSC(m);
}

void movieEvent (Movie m) {
  m.read ();
}

Ju Young Park – FaceOSC

by ju @ 5:03 am

For this project, I have created Face Turntable using Processing and FaceOSC. In this program, processing reads face signals from FaceOSC and use them to mix sound through changing playing rates and volumes as if a user is a DJ who plays a song with turn table. For instance, a user’s mouth width and height control the speeding rates of playing sound, and a user’s eyebrow left and eyebrow right control the volume of playing sound.

For a demo, I chose a random electronic song, called La Musica Electronica. I personally do not know the DJ who made this song, and I got this song from youtube.

<Still Image>

 

<Video Demo>

[youtube=https://www.youtube.com/watch?v=oBlDh7AajwE]

 

Duncan Boehle – 13-9-65

by duncan @ 4:59 am

This is my attempt at generating pieces of art that follow the convents of Frieder Nake’s work 13/9/65. Press any key to continually generate more random versions.

//
// Duncan Boehle
// Emulation of 13/9/65 - Nake
//
 
int minCols = 6;
int maxCols = 8;
int minRows = 8;
int maxRows = 12;
int minCircles = 4;
int maxCircles = 8;
int minRadius = 3;
int maxRadius = 50;
float vertProb = 0.25f;
float crossProb = 0.35f;
int sideSize = 550;
int sideBuffer = 8;
 
ArrayList heightRows;
 
// ArrayList of rows, which is length "rows", and each
// element is an ArrayList of length "cols"
// each element of this inner ArrayList is a Box
Box[][] boxes;
 
int numRows;
int numCols;
int[] colMinXs;
int[] rowStartYs;
 
ArrayList circles;
 
void setup() {
  size(566, 566);
  smooth();
  stroke(0);
  strokeWeight(1.5);
  noFill();
 
  drawNake();
}
 
public void drawNake() {
 
  background(255);
 
  heightRows = new ArrayList();
  numRows = int(random(minRows, maxRows));
  numCols = int(random(minCols, maxCols));
  boxes = new Box[numRows][numCols];
 
  colMinXs = makePosArray(numCols, sideBuffer, sideSize + sideBuffer, 1.0f, 3.0f);
  rowStartYs = makePosArray(numRows, sideBuffer, sideSize + sideBuffer, 1.0f, 2.5f);
 
  for (int y = 0; y &lt;= numRows; y++) {
    ArrayList row = new ArrayList();
    int rowHeight = y &lt; numRows ? rowStartYs[y] : (sideSize + sideBuffer);
    row.add(rowHeight);
    for (int x = 0; x  0 &amp;&amp; y &lt; numRows) {
        rowHeight += int(random(-12, 12));
      }
      row.add(rowHeight);
    }
 
    heightRows.add(row);
  }
 
  rect(sideBuffer, sideBuffer, sideSize, sideSize);
 
  for (int y = 0; y &lt; numRows; y++) {
    ArrayList topRowHeightRow = (ArrayList)heightRows.get(y);
    ArrayList botRowHeightRow = (ArrayList)heightRows.get(y + 1);
    for (int x = 0; x &lt; numCols; x++) {
      int minX = colMinXs[x];
      int maxX = (x &lt; numCols - 1) ? colMinXs[x + 1] : (sideSize + sideBuffer);
      int ulY = (Integer)topRowHeightRow.get(x);
      int urY = (Integer)topRowHeightRow.get(x + 1);
      int blY = (Integer)botRowHeightRow.get(x);
      int brY = (Integer)botRowHeightRow.get(x + 1);
 
      line(minX, ulY, maxX, urY);
      //line(minX, ulY, minX, blY);
      //line(maxX, urY, maxX, brY);
      line(minX, blY, maxX, brY);
 
      float rand = random(0.0f, 1.0f);
      int type = Box.TYPE_EMPTY;
      if (rand &lt; vertProb)
        type = Box.TYPE_VERTICAL;
      else if (rand  0) {
        Box boxAbove = boxes[y - 1][x];
        if (type == Box.TYPE_VERTICAL &amp;&amp; boxAbove.type == Box.TYPE_VERTICAL) {
          newBox = boxAbove;
        }
      }
 
      if (newBox == null) {
        newBox = new Box(type, int(random(1, 5)));
      }
      newBox.draw(minX, maxX, ulY, urY, blY, brY);
      boxes[y][x] = newBox;
    }
  }
 
  int numCircles = int(random(minCircles, maxCircles));
  circles = new ArrayList();
  for (int i = 0; i &lt; numCircles; i++) {
    int rad = int(random(minRadius, maxRadius));
    int x = int(random(2 * sideBuffer + rad, sideSize - rad));
    int y = int(random(2 * sideBuffer + rad, sideSize - rad));
    Circle circle = new Circle(x, y, rad);
 
    boolean intersects = false;
    for (int c = 0; c &lt; circles.size(); c++) {
      Circle otherCircle = (Circle)circles.get(c);
      if (circle.intersects(otherCircle)) {
        intersects = true;
        break;
      }
    }
 
    if (!intersects) {
      circles.add(circle);
      ellipse(x, y, rad * 2, rad * 2);
    }
  }
}
 
public int[] makePosArray(int num, int minN, int maxN, float minRat, float maxRat) {
  float[] ratioList = new float[num];
  float totalRat = 0.0f;
  for (int i = 0; i &lt; num; i++) {
    float ratio = random(minRat, maxRat);
    ratioList[i] = ratio;
    totalRat += ratio;
  }
 
  int curN = minN;
  int[] pixelList = new int[num];
  for (int i = 0; i &lt; num; i++) {
    pixelList[i] = curN;
    float ratio = ratioList[i];
    ratio /= totalRat;
    curN += ratio * (maxN - minN);
  }
 
  return pixelList;
}
 
void draw() {
  if (keyPressed) {
    drawNake();
  }
}
 
class Box {
 
  public static final int TYPE_EMPTY = 0;
  public static final int TYPE_VERTICAL = 1;
  public static final int TYPE_CROSSED = 2;
 
  public int type;
  public int maxDegree;
  public ArrayList topRow;
  public ArrayList bottomRow;
 
  public Box(int type, int maxDegree) {
    this.type = type;
    this.maxDegree = maxDegree;
    topRow = new ArrayList();
    bottomRow = new ArrayList();
 
    switch (type) {
      case TYPE_EMPTY:
        break;
      case TYPE_VERTICAL:
        fillRow(topRow, 2, 16);
        break;
      case TYPE_CROSSED:
        fillRow(topRow, 2, 16);
        fillRow(bottomRow, 2, 16);
        break;
      default:
        break;
    }
  }
 
  public void draw(int minX, int maxX, int ulY, int urY, int blY, int brY) {
 
    switch (type) {
      case TYPE_EMPTY:
        break;
      case TYPE_VERTICAL:
        // for each point along the line, draw a vertical line to the bottom
        for (int i = 0; i &lt; topRow.size(); i++) {
          float n = (Float)topRow.get(i);
          float x = lerp(minX, maxX, n);
          float topY = lerp(ulY, urY, n);
          float bottomY = lerp(blY, brY, n);
          line(x, topY, x, bottomY);
        }
        break;
      case TYPE_CROSSED:
        // for each point along the top row, draw a random number of lines
        // to points in the bottom row
        for (int i = 0; i &lt; topRow.size(); i++) {
          float topN = (Float)topRow.get(i);
          float topX = lerp(minX, maxX, topN);
          float topY = lerp(ulY, urY, topN);
 
          int outDegree = int(random(1, maxDegree));
          for (int j = 0; j &lt; outDegree; j++) {
            int randIndex = int(random(0, bottomRow.size()));
            float botN = (Float)bottomRow.get(randIndex);
            float botX = lerp(minX, maxX, botN);
            float botY = lerp(blY, brY, botN);
            line(topX, topY, botX, botY);
          }
        }
        break;
      default:
        break;
    }
 
  }
 
  public void fillRow(ArrayList inList, int minEls, int maxEls) {
    int numEls = (int)random(minEls, maxEls);
    inList.clear();
 
    for (int i = 0; i &lt; numEls; i++) {
      inList.add(random(0.0f, 1.0f));
    }
 
    return;
  }
}
 
class Circle {
  public int x;
  public int y;
  public int rad;
 
  public Circle(int x, int y, int rad) {
    this.x = x;
    this.y = y;
    this.rad = rad;
  }
 
  public boolean intersects(Circle other) {
    int xdiff = other.x - x;
    int ydiff = other.y - y;
    float distance = sqrt(xdiff * xdiff + ydiff * ydiff);
 
    return distance &lt; (other.rad + rad);
  }
}

Sarah Keeling; 13-9-65

by sarah @ 4:55 am

gauntlet_part1_try5

Click to generate different variations.
 

 

//Sarah Keeling's reproduction of Frieder Nake's 13/9/65 
//for Golan Levin's IACD at Carnegie Mellon University, Spring 2012

PVector line0 [];
PVector line1 [];
PVector line2 [];
PVector line3 [];
PVector line4 [];
PVector line5 [];
PVector line6 [];
PVector line7 [];
PVector line8 [];
PVector line9 [];

void setup() {
  size(600, 600);
  strokeWeight( 2 );
  smooth();
  background (255);
  frameRate (10);
}

void mousePressed() {
  loop();
}

void draw () {

  line0 = drawHLine( -20 ); 
  drawDiagonalLines( line0, line1, 4);

  line1 = drawHLine( 40 ); 
  drawVerticalLines( line1, line2, (int) random (3, 4) ); 
  drawDiagonalLines( line1, line2, 1 ); 
  drawDiagonalLines( line1, line2, (int) random (3) );
  drawDiagonalLines( line1, line2, (int) random (3, 5)); 

  line2 = drawHLine( 120 ); 
  drawVerticalLines( line2, line3, 1 ); 
  drawVerticalLines( line2, line3, (int)random (2, 4) ); 
  drawDiagonalLines( line2, line3, (int) random (3, 4)); 

  line3 = drawHLine( 220 ); 
  drawVerticalLines( line3, line4, (int) random (1)); 
  drawDiagonalLines( line3, line4, (int) random(2));
  drawDiagonalLines( line3, line4, (int) random(3, 5));

  line4 = drawHLine( 268 );
  drawVerticalLines( line4, line5, 1 ); 
  drawDiagonalLines( line4, line5, (int) random(2));
  drawDiagonalLines( line4, line5, (int) random(3, 5));

  line5 = drawHLine( 340 );
  drawVerticalLines( line5, line6, (int) random (3)); 
  drawVerticalLines( line5, line6, 3); 
  drawDiagonalLines( line5, line6, (int) random(1));
  drawDiagonalLines( line5, line6, (int)random (3, 4));

  line6 = drawHLine( 390 );
  drawVerticalLines( line6, line7, 2); 
  drawDiagonalLines( line6, line7, (int)random (4));

  line7 = drawHLine( 460 );
  drawVerticalLines( line7, line8, (int) random (2, 4)); 
  drawDiagonalLines( line7, line8, (int)random (2));
  drawDiagonalLines( line7, line8, 0 );

  line8 = drawHLine( 560 );
  drawDiagonalLines( line8, line9, (int)random(2, 4));

  line9 = drawHLine( 650 );


  circles ( 60, 3);
  circles ( 120, 5);

  noLoop();
}

void drawVerticalLines( PVector[] top, PVector[] bottom, int segment) {

  PVector left = top[segment];
  PVector right = top[segment+1];

  noStroke();
  // fill( #FF0000 );
  //ellipse( left.x, left.y, 8, 8);

  int numberOfLines = 20;

  strokeWeight( 1);
  stroke( #000000 ); 
  for ( int i = 0; i< numberOfLines; i++ ) {
    PVector temp = new PVector( (right.x - left.x), (right.y - left.y) );

    float whereItGoes = random(1);    
    line( (temp.x * whereItGoes + left.x), (temp.y * whereItGoes + left.y), 
    (temp.x * whereItGoes + left.x), (temp.y * whereItGoes + left.y) + 200 );
  }
}

void drawDiagonalLines( PVector[] top, PVector[] bottom, int segment) {

  PVector left = top[segment];
  PVector right = top[segment+1];

  noStroke();

  int numberOfLines = 20;

  strokeWeight( 1);
  stroke( #000000 ); 
  for ( int i = 0; i< numberOfLines; i++ ) {
    PVector temp = new PVector( (right.x - left.x), (right.y - left.y) );

    float whereItGoes = random(1);
    line( (temp.x * whereItGoes + left.x), (temp.y * whereItGoes + left.y), 
    (temp.x * (1-whereItGoes + random(.5)) + left.x), (temp.y * whereItGoes +
      left.y) + 150 );
  }
}


PVector[] drawHLine( int yStart ) {

  stroke (0);
  PVector [] tempLine = new PVector[9];
  PVector start = new PVector( 0, yStart );
  tempLine[0] = start;

  fill(255);
  beginShape();
  for ( int i = 0; i< 8; i++ ) {
    PVector next = new PVector( start.x + (int)random( 200 )+50, start.y +
      (int)random(30) - 20);     
    tempLine[i+1] = next ;

    if (i==0) {
      vertex (start.x, start.y);
    } 
    vertex (next.x, next.y );

    start = next;
  }

  vertex (600, 600);
  vertex (0, 600);
  endShape();

  return tempLine;
}

void circles ( int circleSize, int numCircles ) {
  int tempsize;
  stroke (0);
  strokeWeight (1);

  noFill ();
  strokeWeight (1);
  stroke (0);

  for ( int i = 0; i< numCircles; i++ ) {

    tempsize = (int) random ( 10, circleSize );

    if (tempsize/2 < width- tempsize/2) {
      
      ellipse( random( 0, width ), random( 0, height), tempsize, tempsize);
    }
  }
}



Ju Young Park – 13-9-65

by ju @ 4:47 am

As a practice for this course, I have tried to reproduce the image  “13-9-65” exactly same as much as possible by utilizing Processing.

 

Nir Rachmel | FaceOSC

by nir @ 4:30 am

In the following project, we were asked to do something “cool” with FaseOSC and Processing. I designed an interaction that allows the user to use his face to search for queries on twitter.

Once the user starts, he is presented with two pairs of opposite terms and the word “myself” in the middle. The pairs of words always change and are randomly selected. But the user can always look for tweets that have the word “myself”. Moving the user’s head, moves the cursor on the screen. The further the face goes, the bigger the pointer gets.

In order to select a word (“click”), the user has to open his mouth. Then he is transferred to another screen where he sees that query result. Hope you enjoy it!

[vimeo https://vimeo.com/35558848]

VarvaraToulkeridou-LookingOutwards-1

by varvara @ 4:07 am

Montblanc Generative Artworks, onformative, 2011

project’s webpage: http://www.onformative.com/work/montblanc-artworks/

This project was developed as a product presentation for the Montblanc watches product line. The idea is that each product creates its own variation of generative artwork following rules defined by the artist. The artwork has been conceptualized as the interaction of two elements – linear structures and amorphous bodies. The linear structures, formed as networks of lines, visualize the mechanism and the high precision of the movement. The amorphous bodies, formed by liquid silver and gold, represent the high quality of the materials that the watch is composed of. I find the artist’s selection of the two elements really effective because it creates a series of strong contradictions: linear and amorphous, rigid and fluid, void and full, structured and freeform.

All the watch specifications, for example size, material, casing type, etc., are read from a product database and a corresponding animation is generated. The animations were created in processing. Libraries as toxiclibs for the fluid animation, GLGraphics for shading, Lee Byrons meshLib and the Ani Tweaning for the meshing and its animation as well as ControlP5 and ProScene for camera and control were used.

 

Computer Augmented Crafts, Christian Fiebig, 2011

project’s web page: http://christianfiebig.de/computeraugmentedcrafts/

I selected this project because is related to one of my main research interests: how a computer interface can creatively assist the designer during the design process. I wish there was also a video that would demonstrate the prototype in action! The prototype involves a computer that recognizes the structures created on-camera by spot-welding thin strips of metal together and instantly generates other design suggestions based on any special parameters programmed by the designer. This project highlights a way of exploiting the advantages of technology to enhance traditional craftsmanship. Software used was vvvv and fiducial marker tracker on a Windows XP Desktop PC with webcam.

Hydrogeny, Eveline Domnitch & Dmitry Gelfand, 2010

project’s web page: http://portablepalace.com/hydrogeny.html

The following video comes from an installation composed of a water-filled container and an array of electrodes situated at the bottom of the container. The electrical perturbation, originating form the electrodes, splits water into hydrogen and oxygen gas resulting to the emergence of bubble clouds which are slowly detaching from the electrode surface and rise towards the liquids surface. I find really interesting how the visual effect of the form emergence is being enhanced by sound and color; the combination of the three makes the installation environment really immersive. The bubble formation is accompanied by acoustic vibrations generated by the transducers and the bubbles themselves. In addition, a white laser sheet scans and illuminates the hydrogen bubble formations resulting to each bubble surface divides the white light into its constituent spectrum of color.

Link to the video:

hydrogenymov.htm

 

 

 

 

 

 


« Previous PageNext Page »
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
(c) 2023 Interactive Art and Computational Design, Spring 2012 | powered by WordPress with Barecity