Kinect=003=skeleton tracking 3d

Post on 28-Mar-2016

218 views 2 download

Tags:

description

Kinect Skeleton Tracking

Transcript of Kinect=003=skeleton tracking 3d

KINECTSkeleton Tracking

3D

03

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)

* ----------------------------------------------------------------------------

*/

import SimpleOpenNI.*;

SimpleOpenNI context;

float zoomF =0.5f;

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);

boolean autoCalib=true;

PVector bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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)

};

Delete the description.

Delete the rotation part.

***before setup();

import SimpleOpenNI.*;

SimpleOpenNI context;

PVector bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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);

}

For the setup();

Only need to delete these lines.

***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();

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);

int[] depthMap = context.depthMap();

int[] userMap = context.userMap();

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

// 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 ]);

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

}

}

}

endShape();

// 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 the kinect cam

context.drawCamFrustum();

}

Delete the default rotation parts.

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 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();

}

Draw the skeleton.

Draw the Center of Mass.

Draw the Camara.

***draw();

Hide these 2 lines, VERY IMPORTANT!

// 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);

strokeWeight(1);

}

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);

drawJointOrientation(userId,jointType1,jointPos1,50);

}

***function & event

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);

popMatrix();

}

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

// SimpleOpenNI user events

void onNewUser(SimpleOpenNI curContext,int userId)

{

println("onNewUser - userId: " + userId);

println("\tstart tracking skeleton");

context.startTrackingSkeleton(userId);

}

void onLostUser(SimpleOpenNI curContext,int userId)

{

println("onLostUser - userId: " + userId);

}

void onVisibleUser(SimpleOpenNI curContext,int userId)

{

//println("onVisibleUser - userId: " + userId);

}

We keep these.

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;

}

}

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();

}

We delete this.

“Keypressed” function

***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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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);

stroke(255,255,255);

smooth();

}

Set up a PeasyCam.

***setup();

RUN IT!!!

Hey mom,

I am upside

down!

void draw(){context.update();

background(0,0,0);

///////////////////////////////flip

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();

// draw the kinect cam

context.drawCamFrustum();

popMatrix();

}

For some reason, you have to hide or delete

these 2 lines!!!!!!!!!!!!!!!!!!!!!!!!!!!

The way I fix it.

(Not guarantee that

it’s the best way)

Flip & change the Camera by rotation and scale

pair

RUN IT!!!

Hey mom,

I am

BACK!

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

***drawJointOrientation

This is the strokeWeight of the limbs.

limbs

RUN IT!!!

joints

I would like to change

colors of my skeleton.

Let’s

make

HEAD

// 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);

strokeWeight(1);

}

***drawSkeleton

Get the head

Draw the head

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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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();

Add the boundSize for

defining the boundary size

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);

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();

// draw the kinect cam

context.drawCamFrustum();

}

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();

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();

// draw the kinect cam

context.drawCamFrustum();

popMatrix();

}

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();

translate(0, boundSize/4, boundSize/2);

rotateX(PI/2);

stroke(255, 0, 255);

noFill();

rectMode(CENTER);

rect(0,0,boundSize,boundSize);

popMatrix();

***draw();

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 the kinect cam

context.drawCamFrustum();

popMatrix();

}

Save this file as

“Skeleton3D”

https://vimeo.com/52096931

Let’s play some

CHINESE

RIBBON

DANCE!

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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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);

PVector Rhand = new PVector();

context.getJointPositionSkeleton(userId, SimpleOpenNI.SKEL_RIGHT_HAND, Rhand);

traceR.add(Rhand);

strokeWeight(1);

}

***drawSkeleton

Get your right hand

Put it in the “traceR” bag!

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();

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();

}

}

***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);

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();

}

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();

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);

}

}

}***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);

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

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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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);

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);

}

}

***draw();

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();

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();

}

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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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);

stroke(255,255,255);

smooth();

}***setup();

We don’t have this yet.

Let’s first finish the rest of it and make one

void draw(){if (controlP5.window(this).isMouseOver()) {

cam.setActive(false);

} else {

cam.setActive(true);

}

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);

}

} ***draw();

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();

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

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

camera();

controlP5.draw();

g3.camera = currCameraMatrix;

}

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)

{

……………………….

………….

……………………….

}

…………….

………………………

……..

.

…………………..

………

………………..

…….

***gui();

Put it somewhere after void draw();

I don’t want to list them all.

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");

}

***initGui();

Now we need to get back to our main code,

declare and put these variables in the code

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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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(){if (controlP5.window(this).isMouseOver()) {

cam.setActive(false);

} else {

cam.setActive(true);

}

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 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);

}popMatrix();

if(t > tailSize){

traceR.remove(t- tailSize);

}}

***draw();

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);

if(showTail){

point(0,0,0);

}popMatrix();

if(t > tailSize){

traceL.remove(t-tailSize);

}}

}

// 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();

}

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 bodyCenter = new PVector();

PVector bodyDir = new PVector();

PVector com = new PVector();

PVector com2d = new PVector();

color[] 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();

First, I would like to show

the Grid points without

attraction effect.

Make an ArrayList embedded all the grids’ coordination.

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();

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);

}

}

stroke(255,255,255);

smooth();

}

***setup();

Declare the Grids ArrayList.

Put the grids data inside.

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();

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 d=0; d<grids.size(); d++){

PVector nLoc = (PVector)grids.get(d);

stroke(255);

strokeWeight(10);

point(nLoc.x,nLoc.y,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);

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();

}

Display the grids data we put from setup();

But the grids and

user don’t interact

with each others

So we need the

“Attraction”

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();

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]);

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);

}

} ***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);

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();

}

Get the head coordination as a Attraction point

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();

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]);

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);

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);

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();

}

Calculate the distance and apply them.

and apply them.

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();

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]);

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);}

}***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);

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();

}

Of course you can map some colors

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();

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]);

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();

}

}***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);

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();

}

Of course some other patterns.

It’s your turn to

PLAY