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.