Portal

Portal is an audiovisual installation using motion controls to interact with an imaginary entity.
The hand movements triggers sounds and visual accordingly, becoming more intense when hands are getting closer to it.

I wanted to create the illusion of opening a portal to an arcane world only by the means of both hands.

Leap motion finger tracking are mapped to oF parameters (camera position, opacity and noise function) using ofxLeapMotion:

testApp.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
if( leap.isFrameNew() && simpleHands.size() ){
leap.setMappingX(-230, 230, -ofGetWidth()/2, ofGetWidth()/2);
leap.setMappingY(90, 490, -ofGetHeight()/2, ofGetHeight()/2);
leap.setMappingZ(-150, 150, -200, 200);
for(int i = 0; i < simpleHands.size(); i++){
for(int j = 0; j < simpleHands[i].fingers.size(); j++){
int id = simpleHands[i].fingers[j].id;
ofPoint pt = simpleHands[i].fingers[j].pos;
icoSphere.setRadius( width * 0.5);
cam.setDistance(abs(pt.y)*10);
if(cam.getDistance() > 5000) {
cam.setDistance(5000);
}
noise = pt.z;
if(noise > 0) {
noise = 0;
}
noiseParticle = ofMap(abs(noise), 0, 255, 0., 2.);
colorY = ofMap(abs(pt.y), 0, 490, 0, 255);
if (colorY > 255) {
colorY = 255;
} else if (colorY < 0) {
colorY = 0;
}
colorZ = ofMap(pt.z, 0, 150, 0, 255);
if (colorZ < -255) {
colorZ = -255;
} else if (colorZ > 0) {
colorZ = 0;
}
radiusY = ofMap(abs(pt.y), 0, 490, 0, 1.5);
// camera rotation
float mx = pt.z/(float)ofGetWidth();
float my = pt.x/(float)ofGetHeight();
ofVec3f des(mx*360.0,my*360.0,0);
cameraRotation += (des-cameraRotation)*0.5;
fingersFound.push_back(id);
}
}
}
leap.updateGestures();
leap.markFrameAsOld();




The main pad sound in the background is looped and modulated with feedback grain delay + overdrive effect parameters mapped to the leap MoDULAtion max app by Masayuki Akamatsu.



La Boîte de Pandore

Audio/visual installation project for “studies of interactive objects” class at university back in 2012.

This first prototype version uses a 6 degrees of freedom IMU (ADXL345 + ITG-3200) for transmitting acceleration and rotation data from Arduino to Max/Msp(sound) and Processing(visual) via serial port.

The sensor data is used to move the max/msp buffer playhead for the sound and mapped to rotation and particles position for the visual,
thanks to Memo Akten MSAFluid Processing port.

Wireless support added with Seeed BT Shield in second version :