Final processing code
Revision as of 09:29, 7 January 2016 by LarsNoback (talk | contribs) (Created page with " import SimpleOpenNI.*; ArrayList<PVector[]> worldmaps = new ArrayList<PVector[]>(); final static int BUFFER = 10; //fps * sec SimpleOpenNI context; float zoomF =0....")
import SimpleOpenNI.*;
ArrayList<PVector[]> worldmaps = new ArrayList<PVector[]>();
final static int BUFFER = 10; //fps * sec
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);
void setup()
{
frameRate(10); size(displayWidth, displayHeight, P3D);
context = new SimpleOpenNI(this); if (context.isInit() == false) { println("Can't init SimpleOpenNI, maybe the camera is not connected!"); exit(); return; }
// disable mirror context.setMirror(false);
// enable depthMap generation context.enableDepth();
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); rotateX(rotX); rotateY(rotY); scale(zoomF);
int[] depthMap = context.depthMap(); int steps = 3; // to speed up the drawing, draw every third point int index; PVector realWorldPoint;
translate(0, 0, -1000); // set the rotation center of the scene 1000 infront of the camera
color from = color(0, 50, 200); color to = color(255, 0, 0);
// strokeWeight(2);
PVector[] worldMap = new PVector[context.depthMapRealWorld().length]; myCopy(context.depthMapRealWorld(), worldMap); worldmaps.add(worldMap); int whichWorld = 0; //int whichWorld = worldmaps.size() - BUFFER; println("Buffering World: " + worldmaps.size() + " of " + BUFFER);
if (worldmaps.size() >= BUFFER) { whichWorld = 0; //whichWorld = worldmaps.size() - 1; //z nnhnhnnnnawhichWorld = int(random(0, BUFFER));
PVector[] realWorldMap = worldmaps.get(whichWorld);
// draw pointcloud noFill(); beginShape(TRIANGLES); for (int y=0; y < context.depthHeight (); y+=steps) { for (int x=0; x < context.depthWidth (); x+=steps) { index = x + y * context.depthWidth();
{ // draw the projected point // realWorldPoint = context.depthMapRealWorld()[index]; realWorldPoint = realWorldMap[index]; // make realworld z negative, in the 3d drawing coordsystem +z points in the direction of the eye //calculate the mix between 0 and 1 float mix = map(realWorldPoint.z, 1000, 2000, 0, 1); color interA = lerpColor(from, to, mix); stroke(interA); if ((realWorldPoint.z>100)&&(realWorldPoint.z<2000)) vertex(realWorldPoint.x, realWorldPoint.y, realWorldPoint.z); } //println("x: " + x + " y: " + y); } } endShape(); worldmaps.remove(0); } // draw the kinect cam //context.drawCamFrustum();
}
void myCopy( PVector[] vec1 , PVector[] vec2) {
for(int i = 0; i < vec1.length; i++) { vec2[i] = vec1[i].get(); }
}
void keyPressed() {
switch(key) { case ' ': context.setMirror(!context.mirror()); break; }
switch(keyCode) { case LEFT: rotY += 0.1f; break; case RIGHT: // zoom out 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; }
}