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