-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit c4e9b28
Showing
1 changed file
with
183 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,183 @@ | ||
/* -------------------------------------------------------------------------- | ||
* SimpleOpenNI AlternativeViewpoint3d Test | ||
* -------------------------------------------------------------------------- | ||
* Processing Wrapper for the OpenNI/Kinect library | ||
* http://code.google.com/p/simple-openni | ||
* -------------------------------------------------------------------------- | ||
* prog: Max Rheiner / Interaction Design / zhdk / http://iad.zhdk.ch/ | ||
* date: 06/11/2011 (m/d/y) | ||
* ---------------------------------------------------------------------------- | ||
*/ | ||
|
||
|
||
import SimpleOpenNI.*; | ||
import processing.opengl.*; | ||
import ddf.minim.*; | ||
|
||
Minim minim; | ||
AudioInput in; | ||
|
||
SimpleOpenNI context; | ||
float zoomF =0.3f; | ||
float rotX = radians(180); // by default rotate the hole scene 180deg around the x-axis, | ||
// the data from openni comes upside down | ||
float rotY = radians(0); | ||
float transX = 0; | ||
float transY = 0; | ||
int sphereRadius = 15; | ||
|
||
void setup() | ||
{ | ||
size(320,240,OPENGL); | ||
sphereDetail(10); | ||
|
||
// let's set up the audio in | ||
minim = new Minim(this); | ||
// get a line in from Minim, default bit depth is 16 | ||
in = minim.getLineIn(Minim.STEREO, 512); | ||
|
||
//context = new SimpleOpenNI(this,SimpleOpenNI.RUN_MODE_SINGLE_THREADED); | ||
context = new SimpleOpenNI(this); | ||
|
||
// disable mirror | ||
context.setMirror(false); | ||
|
||
// enable depthMap generation | ||
if(context.enableDepth() == false) | ||
{ | ||
println("Can't open the depthMap, maybe the camera is not connected!"); | ||
exit(); | ||
return; | ||
} | ||
|
||
if(context.enableRGB() == false) | ||
{ | ||
println("Can't open the rgbMap, maybe the camera is not connected or there is no rgbSensor!"); | ||
exit(); | ||
return; | ||
} | ||
|
||
// align depth data to image data | ||
context.alternativeViewPointDepthToImage(); | ||
|
||
stroke(255,255,255); | ||
smooth(); | ||
perspective(radians(45), | ||
float(width)/float(height), | ||
10,150000); | ||
} | ||
|
||
void draw() | ||
{ | ||
// update the cam | ||
context.update(); | ||
|
||
background(0,0,0); | ||
|
||
translate(width/2, height/2, 0); | ||
translate(transX, transY, 0); | ||
rotateX(rotX); | ||
rotateY(rotY); | ||
scale(zoomF); | ||
|
||
PImage rgbImage = context.rgbImage(); | ||
int[] depthMap = context.depthMap(); | ||
int steps = 10; // to speed up the drawing, draw every third point | ||
int index; | ||
PVector realWorldPoint; | ||
color pixelColor; | ||
|
||
strokeWeight(steps); | ||
|
||
translate(0,0,-1000); // set the rotation center of the scene 1000 infront of the camera | ||
|
||
PVector[] realWorldMap = context.depthMapRealWorld(); | ||
for(int y=0;y < context.depthHeight();y+=steps) | ||
{ | ||
for(int x=0;x < context.depthWidth();x+=steps) | ||
{ | ||
index = x + y * context.depthWidth(); | ||
if(depthMap[index] > 0) | ||
{ | ||
// get the color of the point | ||
pixelColor = rgbImage.pixels[index]; | ||
stroke(pixelColor); | ||
fill(pixelColor); | ||
|
||
// draw the projected point | ||
realWorldPoint = realWorldMap[index]; | ||
//point(realWorldPoint.x,realWorldPoint.y,realWorldPoint.z); // make realworld z negative, in the 3d drawing coordsystem +z points in the direction of the eye | ||
pushMatrix(); | ||
translate(realWorldPoint.x, realWorldPoint.y, realWorldPoint.z); | ||
sphere(getSphereRadius()); | ||
popMatrix(); | ||
} | ||
} | ||
} | ||
|
||
// draw the kinect cam | ||
//context.drawCamFrustum(); | ||
} | ||
|
||
float getSphereRadius() { | ||
float output = in.left.get(0) * 1000; | ||
if(output < 5.0) { | ||
return 5.0; | ||
} else { | ||
return output; | ||
} | ||
} | ||
|
||
void stop() | ||
{ | ||
// always close Minim audio classes when you are done with them | ||
in.close(); | ||
minim.stop(); | ||
|
||
super.stop(); | ||
} | ||
|
||
void keyPressed() | ||
{ | ||
switch(key) | ||
{ | ||
case ' ': | ||
context.setMirror(!context.mirror()); | ||
break; | ||
} | ||
|
||
switch(keyCode) | ||
{ | ||
case LEFT: | ||
if(keyEvent.isShiftDown()) { | ||
transX -= 5; | ||
} else { | ||
rotY += 0.1f; | ||
} | ||
break; | ||
case RIGHT: | ||
if(keyEvent.isShiftDown()) { | ||
transX += 5; | ||
} else { | ||
rotY -= 0.1f; | ||
} | ||
break; | ||
case UP: | ||
if(keyEvent.isShiftDown()) | ||
zoomF += 0.02f; | ||
else | ||
rotX += 0.1f; | ||
break; | ||
case DOWN: | ||
if(keyEvent.isShiftDown()) | ||
{ | ||
zoomF -= 0.02f; | ||
if(zoomF < 0.01) | ||
zoomF = 0.01; | ||
} | ||
else | ||
rotX -= 0.1f; | ||
break; | ||
} | ||
} | ||
|