Post date: 2013/07/01 10:57:17
/* -------------------------------------------------------------------------- * SimpleOpenNI demo "KINECT2進数" 複数で遊べます ((c)2013 T.Takaishi)  * --------------------------------------------------------------------------  * Processing Wrapper for the OpenNI/Kinect library  * http://code.google.com/p/simple-openni  * --------------------------------------------------------------------------  */  import SimpleOpenNI.*; SimpleOpenNI  context; boolean flagascii=false; void setup() {   context = new SimpleOpenNI(this);   context.setMirror(true);   context.enableDepth();   context.enableUser(SimpleOpenNI.SKEL_PROFILE_UPPER); // Skelton の上半身のみ使用   background(200,0,0);   noStroke();   smooth();   size(context.depthWidth(), context.depthHeight()); } void draw() {   // update the cam   context.update();   image(context.depthImage(),0,0);   getBin(); } void getBin() {   int[] userList = context.getUsers();   int[] digit =new int[2]; // 2進数2桁    int num10 = 0;     // 10進数   String strnum2=""; // 2進数の文字列   for(int i=0;userList.length;i++)   {     if(context.isTrackingSkeleton(userList[i]))     {       // Get joint positions       PVector pos_RightHand = new PVector();       get_RealJointPosition(userList[i],SimpleOpenNI.SKEL_RIGHT_HAND,pos_RightHand);       PVector pos_RightShoulder = new PVector();       get_RealJointPosition(userList[i],SimpleOpenNI.SKEL_RIGHT_SHOULDER,pos_RightShoulder);       PVector pos_LeftHand = new PVector();       get_RealJointPosition(userList[i],SimpleOpenNI.SKEL_LEFT_HAND,pos_LeftHand);       PVector pos_LeftShoulder = new PVector();       get_RealJointPosition(userList[i],SimpleOpenNI.SKEL_LEFT_SHOULDER,pos_LeftShoulder);       PVector pos_Torso = new PVector();       get_RealJointPosition(userList[i],SimpleOpenNI.SKEL_TORSO,pos_Torso);       // Make digits (左上が (0,0))       if(pos_RightHand.y < pos_RightShoulder.y) digit[0]=1; else digit[0]=0;       if(pos_LeftHand.y < pos_LeftShoulder.y) digit[1]=1; else digit[1]=0;       // Draw colored circle on hands       drawCircle(pos_RightHand, digit[0], 20);       drawCircle(pos_LeftHand, digit[1], 20);       // Draw numbers on torso       drawNum(pos_Torso, i, 80);       // Calculate number and make string       num10=num10*4+digit[1]*2+digit[0];       strnum2=strnum2+str(digit[1])+str(digit[0]);     }   }   strnum2 = strnum2+"="+str(num10);   if(flagascii) // Display ASCII code   {     if(userList.length > 3) // 2^6=64, 'A'=65       strnum2 = strnum2+" ["+(char)num10+"]";     else       strnum2 = strnum2+" ["+(char)(num10+'A'-1)+"]";   }   fill(2555,255,255);   textSize(80);    text(strnum2,60,100); }  void get_RealJointPosition(int userId, int type, PVector pos) {       PVector jointPos = new PVector();       context.getJointPositionSkeleton(userId,type,jointPos);       context.convertRealWorldToProjective(jointPos,pos); }  void drawCircle(PVector pos, int num, int size) {   pushMatrix();   translate(pos.x,pos.y); // translate to the position of the Hand   if(num==1) fill(255,0,0); else fill(0,255,0);   ellipse(0,0,size,size);   popMatrix(); }  void drawNum(PVector pos, int num, int size) {   fill(0,0,0);   textSize(size);   text(str(num),pos.x,pos.y); }  void keyPressed() {   switch(key)   {     case 'a': // Switch for displaying ASCII code       if(!flagascii) flagascii=true; else flagascii=false;       break;     case 'q':       exit();       break;   } }  // ----------------------------------------------------------------- // SimpleOpenNI events void onNewUser(int userId) {   context.requestCalibrationSkeleton(userId,true); }  void onEndCalibration(int userId, boolean successfull) {     if (successfull)    {      println("  User calibrated !!!");     context.startTrackingSkeleton(userId);    } }