Kinect=003=skeleton tracking 3d

Page 1

03

KINECT Skeleton Tracking 3D


READY for 3D?


Let’s Start with Looking at the Example.


Open this example to check


Run the Code!


Camera

You

You can pressed your keyboard “up, down, right, left” to change the angle.


But I would like to use “peasyCam” instead.


Let’s try to clean up the code, first.


/* -------------------------------------------------------------------------* SimpleOpenNI User3d Test * -------------------------------------------------------------------------* Processing Wrapper for the OpenNI/Kinect 2 library * http://code.google.com/p/simple-openni * -------------------------------------------------------------------------* prog: Max Rheiner / Interaction Design / Zhdk / http://iad.zhdk.ch/ * date: 12/12/2012 (m/d/y) * ---------------------------------------------------------------------------*/

Delete the description.

import SimpleOpenNI.*;

SimpleOpenNI context; float float axis,

zoomF =0.5f; rotX = radians(180); // by default rotate the hole scene 180deg around the x-

Delete the rotation part.

// the data from openni comes upside down float rotY = radians(0); boolean autoCalib=true; PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

***before setup();


import SimpleOpenNI.*; SimpleOpenNI context; PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

Yes, it’s like this ***before setup();


void setup(){ size(1024,768,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(); // enable skeleton generation for all joints context.enableUser(); stroke(255,255,255); smooth(); perspective(radians(45), float(width)/float(height), 10,150000);

Only need to delete these lines.

}

For the setup(); ***setup();


void setup(){ size(1024,768,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(); // enable skeleton generation for all joints context.enableUser(); stroke(255,255,255); smooth();

}

Like this ***before setup();


// draw the skeleton if it's available int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])) drawSkeleton(userList[i]);

void draw(){ // update the cam context.update(); background(0,0,0); // set the scene pos translate(width/2, height/2, 0); rotateX(rotX); rotateY(rotY); scale(zoomF);

// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

Delete the default rotation parts.

int[] depthMap = context.depthMap(); int[] userMap = context.userMap(); int steps = 3; // to speed up the drawing, draw every third point int index; PVector realWorldPoint;

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z);

translate(0,0,-1000); // set the rotation center of the scene 1000 infront of the camera // draw the pointcloud beginShape(POINTS); 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) { // draw the projected point realWorldPoint = context.depthMapRealWorld()[index]; if(userMap[index] == 0) stroke(100); else stroke(userClr[ (userMap[index] - 1) % userClr.length ]);

vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); fill(0,255,100); text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum();

}

point(realWorldPoint.x,realWorldPoint.y,realWorldPoint.z); } } } endShape();

No point cloud at this moment.

***draw();


void draw(){ // update the cam context.update(); background(0,0,0);

// draw the skeleton if it's available int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])) drawSkeleton(userList[i]);

{

Draw the skeleton.

} // draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

Draw the Center of Mass.

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z);

vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); }

Hide these 2 lines, VERY IMPORTANT! Draw the Camara.

}

// draw the kinect cam context.drawCamFrustum();

***draw();


// draw the skeleton with the selected joints

void drawJointOrientation(int userId,int jointType,PVector pos,float length)

void drawSkeleton(int userId)

{ // draw the joint orientation PMatrix3D orientation = new PMatrix3D(); float confidence = context.getJointOrientationSkeleton(userId,jointType,orientation); if(confidence < 0.001f) // nothing to draw, orientation data is useless return;

{ strokeWeight(3);

// to get the 3d joint data drawLimb(userId, SimpleOpenNI.SKEL_HEAD, SimpleOpenNI.SKEL_NECK); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_LEFT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HAND);

pushMatrix(); translate(pos.x,pos.y,pos.z); // set the local coordsys applyMatrix(orientation);

drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_RIGHT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_RIGHT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_ELBOW, SimpleOpenNI.SKEL_RIGHT_HAND);

// coordsys lines are 100mm long // x - r stroke(255,0,0,confidence * 200 + 55); line(0,0,0, length,0,0); // y - g stroke(0,255,0,confidence * 200 + 55); line(0,0,0, 0,length,0); // z - b stroke(0,0,255,confidence * 200 + 55); line(0,0,0, 0,0,length); popMatrix();

drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_LEFT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_HIP, SimpleOpenNI.SKEL_LEFT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_KNEE, SimpleOpenNI.SKEL_LEFT_FOOT); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_RIGHT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_RIGHT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_KNEE, SimpleOpenNI.SKEL_RIGHT_FOOT); // draw body direction getBodyDirection(userId,bodyCenter,bodyDir); } bodyDir.mult(200); // 200mm length bodyDir.add(bodyCenter); stroke(255,200,200); line(bodyCenter.x,bodyCenter.y,bodyCenter.z, bodyDir.x ,bodyDir.y,bodyDir.z); strokeWeight(1);

// -----------------------------------------------------------------

// SimpleOpenNI user events void onNewUser(SimpleOpenNI curContext,int userId) { println("onNewUser - userId: " + userId); println("\tstart tracking skeleton");

}

context.startTrackingSkeleton(userId); }

void drawLimb(int userId,int jointType1,int jointType2) { PVector jointPos1 = new PVector(); PVector jointPos2 = new PVector(); float confidence; // draw the joint position confidence = context.getJointPositionSkeleton(userId,jointType1,jointPos1); confidence = context.getJointPositionSkeleton(userId,jointType2,jointPos2); stroke(255,0,0,confidence * 200 + 55); line(jointPos1.x,jointPos1.y,jointPos1.z, jointPos2.x,jointPos2.y,jointPos2.z);

void onLostUser(SimpleOpenNI curContext,int userId) { println("onLostUser - userId: " + userId); } void onVisibleUser(SimpleOpenNI curContext,int userId) { //println("onVisibleUser - userId: " + userId); }

We keep these.

drawJointOrientation(userId,jointType1,jointPos1,50); }

***function & event


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.01f; else rotX += 0.1f; break; case DOWN: if(keyEvent.isShiftDown()) { zoomF -= 0.01f; if(zoomF < 0.01) zoomF = 0.01; } else rotX -= 0.1f; break; }

We delete this. “Keypressed” function

} void getBodyDirection(int userId,PVector centerPoint,PVector dir) { PVector jointL = new PVector(); PVector jointH = new PVector(); PVector jointR = new PVector(); float confidence; // draw the joint position confidence = context.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_LEFT_SHOULDER,jointL); confidence = context.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_HEAD,jointH); confidence = context.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_RIGHT_SHOULDER,jointR); // take the neck as the center point confidence = context.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_NECK,centerPoint); /* // manually calc the centerPoint PVector shoulderDist = PVector.sub(jointL,jointR); centerPoint.set(PVector.mult(shoulderDist,.5)); centerPoint.add(jointR); */ PVector up = PVector.sub(jointH,centerPoint); PVector left = PVector.sub(jointR,centerPoint); dir.set(up.cross(left)); dir.normalize(); }

***function & event


Now we need to add the peasyCam.


import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*; SimpleOpenNI context; PeasyCam cam;

PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

Yes, it’s like this ***before setup();


void setup(){ size(1024,768,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(); // enable skeleton generation for all joints context.enableUser(); cam = new PeasyCam(this, 0, 0, 1000, 4000);

Set up a PeasyCam.

stroke(255,255,255); smooth();

}

***setup();


RUN IT!!!

Hey mom, I am upside down!


void draw(){

// draw the kinect cam context.drawCamFrustum();

context.update();

pair

background(0,0,0);

///////////////////////////////flip pushMatrix(); scale(-1,1,1); rotateZ(radians(180)); rotateY(radians(360));

popMatrix();

}

Flip & change the Camera by rotation and scale

// draw the skeleton if it's available int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])) drawSkeleton(userList[i]); // draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

The way I fix it. (Not guarantee that it’s the best way)

For some reason, you have to hide or delete these 2 lines!!!!!!!!!!!!!!!!!!!!!!!!!!!

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape();

//fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } }

***draw();


Hey mom, I am BACK!

RUN IT!!! I would like to change colors of my skeleton.


void drawLimb(int userId,int jointType1,int jointType2) { PVector jointPos1 = new PVector(); PVector jointPos2 = new PVector(); float confidence; // draw the joint position confidence = context.getJointPositionSkeleton(userId,jointType1,jointPos1); confidence = context.getJointPositionSkeleton(userId,jointType2,jointPos2); stroke( 0, 255, 255, confidence * 200 + 55); line(jointPos1.x,jointPos1.y,jointPos1.z, jointPos2.x,jointPos2.y,jointPos2.z); drawJointOrientation(userId,jointType1,jointPos1,50);

} Change here for your skeleton colors.

***drawLimbs()


void drawJointOrientation(int userId,int jointType,PVector pos,float length) { // draw the joint orientation PMatrix3D orientation = new PMatrix3D(); float confidence = context.getJointOrientationSkeleton(userId,jointType,orientation); if(confidence < 0.001f) // nothing to draw, orientation data is useless return; pushMatrix(); translate(pos.x,pos.y,pos.z); // set the local coordsys applyMatrix(orientation); // coordsys lines are 100mm long // x - r stroke(255,0,0,confidence * 200 + 55); line(0,0,0, length,0,0); // y - g stroke(0,255,0,confidence * 200 + 55); line(0,0,0, 0,length,0); // z - b stroke(0,0,255,confidence * 200 + 55); line(0,0,0, 0,0,length);

strokeWeight(10); stroke(0, 255, 255); point(0, 0, 0); popMatrix();

strokeWeight(4);

Go here, and add these lines for drawing the joints This is the strokeWeight of the limbs.

} ***drawJointOrientation


Let’s make HEAD

joints

RUN IT!!! I would like to change colors of my skeleton.

limbs


// draw the skeleton with the selected joints

void drawSkeleton(int userId) { strokeWeight(3); // to get the 3d joint data drawLimb(userId, SimpleOpenNI.SKEL_HEAD, SimpleOpenNI.SKEL_NECK); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_LEFT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HAND); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_RIGHT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_RIGHT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_ELBOW, SimpleOpenNI.SKEL_RIGHT_HAND); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_LEFT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_HIP, SimpleOpenNI.SKEL_LEFT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_KNEE, SimpleOpenNI.SKEL_LEFT_FOOT); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_RIGHT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_RIGHT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_KNEE, SimpleOpenNI.SKEL_RIGHT_FOOT); // draw body direction getBodyDirection(userId,bodyCenter,bodyDir);

bodyDir.mult(200); // 200mm length bodyDir.add(bodyCenter); stroke(255,200,200); line(bodyCenter.x,bodyCenter.y,bodyCenter.z, bodyDir.x ,bodyDir.y,bodyDir.z);

PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_HEAD, joint_HEAD); strokeWeight(50); stroke(255); point(joint_HEAD.x, joint_HEAD.y, joint_HEAD.z);

Get the head

Draw the head

strokeWeight(1);

}

***drawSkeleton


That’s how I like it to be.

Need to get a Boundary.


import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*; SimpleOpenNI context; PeasyCam cam;

int boundSize = 2400; PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

Add the boundSize for defining the boundary size

***before setup();


void draw(){ context.update();

background(0,0,0);

// draw the kinect cam context.drawCamFrustum();

}

pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

pushMatrix(); scale(-1,1,1); rotateZ(radians(180)); rotateY(radians(360)); // draw the skeleton if it's available int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])) drawSkeleton(userList[i]); // draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z); vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } }

***draw();


I looks like a Giant.


But my issue is while you zoom out, you will lose something. SCALE the Skeleton DOWN


void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

// draw the kinect cam context.drawCamFrustum();

popMatrix();

}

pushMatrix(); scale(-1,1,1);

scale(0.5); rotateZ(radians(180)); rotateY(radians(360));

int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])) drawSkeleton(userList[i]); // draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z); vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z);

} }

***draw();


Here you go! Add a fake ground.


void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360));

int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])) drawSkeleton(userList[i]);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z); vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z);

} } // draw the kinect cam context.drawCamFrustum(); popMatrix();

} ***draw();



Save this file as “Skeleton3D”


Let’s play some

CHINESE RIBBON DANCE!

https://vimeo.com/52096931


Hope you still remember ArrayList();


import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*; SimpleOpenNI context; PeasyCam cam; int boundSize = 2400;

ArrayList traceR; PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

***before setup();


void setup(){ size(1024,768,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(); // enable skeleton generation for all joints context.enableUser(); cam = new PeasyCam(this, 0, 0, 1000, 4000);

traceR = new ArrayList(); stroke(255,255,255); smooth();

}

***setup();


// draw the skeleton with the selected joints

void drawSkeleton(int userId){ strokeWeight(3); // to get the 3d joint data drawLimb(userId, SimpleOpenNI.SKEL_HEAD, SimpleOpenNI.SKEL_NECK); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_LEFT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HAND); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_RIGHT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_RIGHT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_ELBOW, SimpleOpenNI.SKEL_RIGHT_HAND); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_LEFT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_HIP, SimpleOpenNI.SKEL_LEFT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_KNEE, SimpleOpenNI.SKEL_LEFT_FOOT); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_RIGHT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_RIGHT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_KNEE, SimpleOpenNI.SKEL_RIGHT_FOOT); // draw body direction getBodyDirection(userId,bodyCenter,bodyDir); bodyDir.mult(200); // 200mm length bodyDir.add(bodyCenter); stroke(255,200,200); line(bodyCenter.x,bodyCenter.y,bodyCenter.z, bodyDir.x ,bodyDir.y,bodyDir.z); PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_HEAD, joint_HEAD); strokeWeight(50); stroke(255); point(joint_HEAD.x, joint_HEAD.y, joint_HEAD.z);

Get your right hand

PVector Rhand = new PVector(); context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_RIGHT_HAND, Rhand); traceR.add(Rhand); strokeWeight(1);

}

Put it in the “traceR” bag!

***drawSkeleton


void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape();

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) {

if(context.isTrackingSkeleton(userList[i])){ drawSkeleton(userList[i]); for(int t =0; t<traceR.size(); t++){ strokeWeight(50); stroke(255,100); PVector rTrace = (PVector)traceR.get(t); pushMatrix(); translate(rTrace.x,rTrace.y,rTrace.z); point(0,0,0); popMatrix(); }

//fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } }

// draw the kinect cam context.drawCamFrustum(); popMatrix();

}

}

***draw();


I can make CLOUD!!!


void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) {

if(context.isTrackingSkeleton(userList[i])){ drawSkeleton(userList[i]); for(int t =0; t<traceR.size(); t++){ strokeWeight(50); //stroke(255,100); PVector rTrace = (PVector)traceR.get(t); float rCR = map(rTrace.x,200,2000,50,255); float rCG = map(rTrace.y,200,2000,50,255); float rCB = map(rTrace.z,200,2000,50,255); stroke(rCR, rCG, rCB); pushMatrix(); translate(rTrace.x,rTrace.y,rTrace.z); point(0,0,0); popMatrix(); if(t > 200){ traceR.remove(t-200); }

} }

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } }

// draw the kinect cam context.drawCamFrustum(); popMatrix();

} Mapping colors

If the trace number is over 200, it will start delete from the first trace

***draw();


THIS IS RIBBON


Now it’s your turn to Give me the LEFT hand


import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*; SimpleOpenNI context; PeasyCam cam; int boundSize = 2400;

ArrayList traceR; ArrayList traceL; PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

***before setup();


void setup(){ size(1024,768,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(); // enable skeleton generation for all joints context.enableUser(); cam = new PeasyCam(this, 0, 0, 1000, 4000);

traceR = new ArrayList(); traceL = new ArrayList(); stroke(255,255,255); smooth();

}

***setup();


// draw the skeleton with the selected joints

void drawSkeleton(int userId){ strokeWeight(3); // to get the 3d joint data drawLimb(userId, SimpleOpenNI.SKEL_HEAD, SimpleOpenNI.SKEL_NECK); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_LEFT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HAND); drawLimb(userId, SimpleOpenNI.SKEL_NECK, SimpleOpenNI.SKEL_RIGHT_SHOULDER); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_RIGHT_ELBOW); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_ELBOW, SimpleOpenNI.SKEL_RIGHT_HAND); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER, SimpleOpenNI.SKEL_TORSO); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_LEFT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_HIP, SimpleOpenNI.SKEL_LEFT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_LEFT_KNEE, SimpleOpenNI.SKEL_LEFT_FOOT); drawLimb(userId, SimpleOpenNI.SKEL_TORSO, SimpleOpenNI.SKEL_RIGHT_HIP); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_RIGHT_KNEE); drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_KNEE, SimpleOpenNI.SKEL_RIGHT_FOOT); // draw body direction getBodyDirection(userId,bodyCenter,bodyDir); bodyDir.mult(200); // 200mm length bodyDir.add(bodyCenter); stroke(255,200,200); line(bodyCenter.x,bodyCenter.y,bodyCenter.z, bodyDir.x ,bodyDir.y,bodyDir.z); PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_HEAD, joint_HEAD); strokeWeight(50); stroke(255); point(joint_HEAD.x, joint_HEAD.y, joint_HEAD.z);

PVector Rhand = new PVector(); context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_RIGHT_HAND, Rhand); traceR.add(Rhand);

PVector Lhand = new PVector(); context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_LEFT_HAND, Lhand); traceL.add(Lhand); strokeWeight(1);

}

***drawSkeleton


void draw(){ context.update(); background(0,0,0);

for(int t =0; t<traceL.size(); t++){ strokeWeight(50); PVector lTrace = (PVector)traceL.get(t); float lCR = map(lTrace.x,200,2000,50,255); float lCG = map(lTrace.y,200,2000,50,255); float lCB = map(lTrace.z,200,2000,50,255); stroke(lCR, lCG, lCB); pushMatrix(); translate(lTrace.x,lTrace.y,lTrace.z); point(0,0,0); popMatrix();

pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix(); pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

if(t > 200){ traceL.remove(t-200); }

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) {

if(context.isTrackingSkeleton(userList[i])){ drawSkeleton(userList[i]); for(int t =0; t<traceR.size(); t++){ strokeWeight(50); PVector rTrace = (PVector)traceR.get(t); float rCR = map(rTrace.x,200,2000,50,255); float rCG = map(rTrace.y,200,2000,50,255); float rCB = map(rTrace.z,200,2000,50,255); stroke(rCR, rCG, rCB); pushMatrix(); translate(rTrace.x,rTrace.y,rTrace.z); point(0,0,0); popMatrix(); if(t > 200){ traceR.remove(t-200); }

} } // draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z); vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } }

// draw the kinect cam context.drawCamFrustum(); popMatrix();

}

}

***draw();


ROCK THE RIBBON!


Let’s add a Button & Slider


import controlP5.*; import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*;

SimpleOpenNI context; PeasyCam cam;

ControlP5 controlP5; PMatrix3D currCameraMatrix; PGraphics3D g3; int boundSize = 2400; ArrayList traceR; ArrayList traceL;

PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

***before setup();


void setup(){ size(1024,768,P3D); context = new SimpleOpenNI(this); g3 = (PGraphics3D)g; 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(); // enable skeleton generation for all joints context.enableUser(); cam = new PeasyCam(this, 0, 0, 1000, 4000); traceR = new ArrayList(); traceL = new ArrayList(); initGUI(); controlP5.setAutoDraw(false);

We don’t have this yet. Let’s first finish the rest of it and make one

stroke(255,255,255); smooth();

}

***setup();


void draw(){

for(int t =0; t<traceL.size(); t++){ strokeWeight(50); PVector lTrace = (PVector)traceL.get(t);

if (controlP5.window(this).isMouseOver()) { cam.setActive(false); } else { cam.setActive(true); }

float lCR = map(lTrace.x,200,2000,50,255); float lCG = map(lTrace.y,200,2000,50,255); float lCB = map(lTrace.z,200,2000,50,255); stroke(lCR, lCG, lCB); pushMatrix(); translate(lTrace.x,lTrace.y,lTrace.z); point(0,0,0); popMatrix();

context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix(); pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])){ drawSkeleton(userList[i]); for(int t =0; t<traceR.size(); t++){ strokeWeight(50); PVector rTrace = (PVector)traceR.get(t); float rCR = map(rTrace.x,200,2000,50,255); float rCG = map(rTrace.y,200,2000,50,255); float rCB = map(rTrace.z,200,2000,50,255); stroke(rCR, rCG, rCB); pushMatrix(); translate(rTrace.x,rTrace.y,rTrace.z); point(0,0,0); popMatrix(); if(t > 200){ traceR.remove(t-200); } }

if(t > 200){ traceL.remove(t-200); } } } // draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z); vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum();

popMatrix();

gui();

We don’t have this yet as well

} ***draw();


void gui() { currCameraMatrix = new PMatrix3D(g3.camera); camera(); controlP5.draw(); g3.camera = currCameraMatrix;

Put it somewhere after void draw();

} void drawSkeleton(int userId) { strokeWeight(5); if(userId%5==1){ scale(1, -1, 1);//turn upside down } else{ scale(1, 1, 1); } ……………………… ……………… ………………… …………………. …….. } void drawLimb(int userId, int jointType1, int jointType2) { ………………………. …………. ………………………. } ……………. ……………………… …….. . ………………….. ……… ……………….. …….

I don’t want to list them all.

***gui();


Add A New Tag “GUI”


These are what we need to add. A button for show/hide Ribbons. A slider for setting up the tailSize.


void initGUI(){ controlP5 = new ControlP5(this);

controlP5.addToggle("showTail",showTail,10,30,20,20).setLabel("show Tail"); controlP5.addSlider("tailSize",50,500,10,10,100,10).setLabel("tail size");

}

Now we need to get back to our main code, declare and put these variables in the code

***initGui();


import controlP5.*; import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*;

SimpleOpenNI context; PeasyCam cam; ControlP5 controlP5; PMatrix3D currCameraMatrix; PGraphics3D g3; int boundSize = 2400;

int tailSize = 100; boolean showTail = true; ArrayList traceR; ArrayList traceL;

PVector PVector PVector PVector color[]

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

***before setup();


void draw(){

for(int t =0; t<traceL.size(); t++){ strokeWeight(50); PVector lTrace = (PVector)traceL.get(t);

if (controlP5.window(this).isMouseOver()) { cam.setActive(false); } else { cam.setActive(true); }

float lCR = map(lTrace.x,200,2000,50,255); float lCG = map(lTrace.y,200,2000,50,255); float lCB = map(lTrace.z,200,2000,50,255); stroke(lCR, lCG, lCB); pushMatrix(); translate(lTrace.x,lTrace.y,lTrace.z);

context.update(); background(0,0,0);

if(showTail){ point(0,0,0); }

pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

popMatrix();

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

if(t > tailSize){ traceL.remove(t-tailSize); } } }

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int int[] userList = context.getUsers();

for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])){ drawSkeleton(userList[i]); for(int t =0; t<traceR.size(); t++){ strokeWeight(50); PVector rTrace = (PVector)traceR.get(t); float rCR = map(rTrace.x,200,2000,50,255); float rCG = map(rTrace.y,200,2000,50,255); float rCB = map(rTrace.z,200,2000,50,255); stroke(rCR, rCG, rCB); pushMatrix(); translate(rTrace.x,rTrace.y,rTrace.z);

if(showTail){ point(0,0,0); }

// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z); vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum();

popMatrix();

popMatrix();

if(t > tailSize){ traceR.remove(t- tailSize); } }

gui();

}

***draw();


You Have Controllers


Finally, We can get rid off RIBBONS


Open your “Skeleton3D� (which only has your skeleton tracking.) We would like to make some Attraction.


import SimpleOpenNI.*; import peasy.test.*; import peasy.org.apache.commons.math.*; import peasy.*; import peasy.org.apache.commons.math.geometry.*; import processing.opengl.*; SimpleOpenNI context; PeasyCam cam; int boundSize = 2400;

ArrayList grids; PVector PVector PVector PVector color[]

Make an ArrayList embedded all the grids’ coordination.

bodyCenter = new PVector(); bodyDir = new PVector(); com = new PVector(); com2d = new PVector(); userClr = new color[]{ color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) };

First, I would like to show the Grid points without attraction effect. ***before setup();


void setup(){ size(1024,768,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(); // enable skeleton generation for all joints context.enableUser(); cam = new PeasyCam(this, 0, 0, 1000, 4000);

grids = new ArrayList();

Declare the Grids ArrayList.

for(int i=-2400; i<=2400; i+=400){ for(int j=0; j<=4800; j+=400){ PVector loc = new PVector(i,0,j); grids.add(loc); } }

Put the grids data inside.

stroke(255,255,255); smooth();

} ***setup();


// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360));

vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum();

int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])){

popMatrix();

}

drawSkeleton(userList[i]); for(int d=0; d<grids.size(); d++){ PVector nLoc = (PVector)grids.get(d); Display the grids data we put from setup(); stroke(255); strokeWeight(10); point(nLoc.x,nLoc.y,nLoc.z); } }

***draw();


But the grids and user don’t interact with each others So we need the “Attraction”


// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix(); pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])){

drawSkeleton(userList[i]);

vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum(); popMatrix();

}

PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_HEAD, joint_HEAD); PVector att = new PVector(joint_HEAD.x,joint_HEAD.y,joint_HEAD.z);

for(int d=0; d<grids.size(); d++){ PVector nLoc = (PVector)grids.get(d); stroke(255,255,0); strokeWeight(10); point(nLoc.x,nLoc.y,nLoc.z); }

}

Get the head coordination as a Attraction point

***draw();


// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z);

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) {

} } // draw the kinect cam context.drawCamFrustum(); popMatrix();

if(context.isTrackingSkeleton(userList[i])){

}

drawSkeleton(userList[i]);

PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_HEAD, joint_HEAD); PVector att = new PVector(joint_HEAD.x,joint_HEAD.y,joint_HEAD.z);

for(int d=0; d<grids.size(); d++){ PVector nLoc = (PVector)grids.get(d); stroke(255,255,0); strokeWeight(10);

float distance = PVector.dist(nLoc,att);

Calculate the distance and apply them.

point(nLoc.x,sq((distance)/100)-boundSize/2,nLoc.z); }

}

and apply them.

***draw();



// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

void draw(){ context.update(); background(0,0,0); pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix();

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z);

pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix(); pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360)); int[] userList = context.getUsers();

vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape(); //fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum();

for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])){

drawSkeleton(userList[i]);

popMatrix();

}

PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_HEAD, joint_HEAD); PVector att = new PVector(joint_HEAD.x,joint_HEAD.y,joint_HEAD.z);

for(int d=0; d<grids.size(); d++){ PVector nLoc = (PVector)grids.get(d); strokeWeight(10);

float distance = PVector.dist(nLoc,att);

stroke(255,0,map(distance,0,6000,50,255)); Of course you can map some colors point(nLoc.x,sq((distance)/100)-boundSize/2,nLoc.z); }

}

***draw();



// draw the center of mass if(context.getCoM(userList[i],com)) { stroke(100,255,0); strokeWeight(1); beginShape(LINES); vertex(com.x - 15,com.y,com.z); vertex(com.x + 15,com.y,com.z);

void draw(){ context.update(); background(0,0,0);

pushMatrix(); translate(0, 0, boundSize/2); stroke(255, 0, 255); noFill(); box(boundSize); popMatrix(); pushMatrix(); translate(0, boundSize/4, boundSize/2); rotateX(PI/2); stroke(255, 0, 255); noFill(); rectMode(CENTER); rect(0,0,boundSize,boundSize); popMatrix();

vertex(com.x,com.y - 15,com.z); vertex(com.x,com.y + 15,com.z); vertex(com.x,com.y,com.z - 15); vertex(com.x,com.y,com.z + 15); endShape();

pushMatrix(); scale(-1,1,1); scale(0.5); rotateZ(radians(180)); rotateY(radians(360));

//fill(0,255,100); //text(Integer.toString(userList[i]),com.x,com.y,com.z); } } // draw the kinect cam context.drawCamFrustum();

int[] userList = context.getUsers(); for(int i=0;i<userList.length;i++) { if(context.isTrackingSkeleton(userList[i])){

drawSkeleton(userList[i]);

popMatrix();

}

PVector joint_HEAD = new PVector(); context.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_HEAD, joint_HEAD); PVector att = new PVector(joint_HEAD.x,joint_HEAD.y,joint_HEAD.z);

for(int d=0; d<grids.size(); d++){ PVector nLoc = (PVector)grids.get(d); strokeWeight(10); float distance = PVector.dist(nLoc,att); stroke(255,0,map(distance,0,6000,50,255)); point(nLoc.x,sq((distance)/100)-boundSize/2,nLoc.z); pushMatrix(); translate(0, -boundSize/2, 0); translate(nLoc.x,nLoc.y,nLoc.z); rotateX(PI/2); stroke(0,255,0); ellipse(0,0,map(distance,0,600,0,40),map(distance,0,600,0,40)); popMatrix();

Of course some other patterns.

}

}

***draw();



It’s your turn to PLAY


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.