ProcessingのサンプルコードRGB Cubeと
Openni-simpleのサンプルProcessingコードHands.pdeを組み合わせて
サンプルを作ってみました。
こんな簡単に動くのかという印象。
やったことは、Hands.pdeのdrawの中をcontext.update()を残して
あとは全部削除。RGB Cubeのdrawをごっそり追加。
PVectorのposが[x,y,z]っぽい配列を返しているのでpos[0]とかで値への
アクセスを試みるも、配列ではないとのエラーが出る。
(ちなみにdrawメソッド内ではposへのアクセスができない、のかな)
なんか昔見たなあと思いつつ勘でpos.xとアクセスするとうまく取れた。
ちなみにpos.xはfloatで返ってきます。
あとはグローバル変数に
float xmag, ymag = 0; float newXmag, newYmag = 0;
を追加したくらい。
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 handsTrackFlag = false; PVector handVec = new PVector(); ArrayList handVecList = new ArrayList(); int handVecListSize = 30; String lastGesture = ""; float xmag, ymag = 0; float newXmag, newYmag = 0; void setup() { size(640, 360, P3D); noStroke(); colorMode(RGB, 1); context = new SimpleOpenNI(this); // disable mirror context.setMirror(false); // enable depthMap generation if(context.enableDepth() == false) { println("Can't open the depthMap, maybe the camera is not connected!"); exit(); return; } // enable hands + gesture generation context.enableGesture(); context.enableHands(); // add focus gestures / here i do have some problems on the mac, i only recognize raiseHand ? Maybe cpu performance ? context.addGesture("Wave"); context.addGesture("Click"); context.addGesture("RaiseHand"); perspective(radians(45), float(width)/float(height), 10.0f,150000.0f); } void draw() { // update the cam context.update(); background(0.5); pushMatrix(); translate(width/2, height/2, -30); //RGB Cube from sample code float diff = xmag-newXmag; if (abs(diff) > 0.01) { xmag -= diff/4.0; } diff = ymag-newYmag; if (abs(diff) > 0.01) { ymag -= diff/4.0; } rotateX(-ymag); rotateY(-xmag); scale(90); beginShape(QUADS); fill(0, 1, 1); vertex(-1, 1, 1); fill(1, 1, 1); vertex( 1, 1, 1); fill(1, 0, 1); vertex( 1, -1, 1); fill(0, 0, 1); vertex(-1, -1, 1); fill(1, 1, 1); vertex( 1, 1, 1); fill(1, 1, 0); vertex( 1, 1, -1); fill(1, 0, 0); vertex( 1, -1, -1); fill(1, 0, 1); vertex( 1, -1, 1); fill(1, 1, 0); vertex( 1, 1, -1); fill(0, 1, 0); vertex(-1, 1, -1); fill(0, 0, 0); vertex(-1, -1, -1); fill(1, 0, 0); vertex( 1, -1, -1); fill(0, 1, 0); vertex(-1, 1, -1); fill(0, 1, 1); vertex(-1, 1, 1); fill(0, 0, 1); vertex(-1, -1, 1); fill(0, 0, 0); vertex(-1, -1, -1); fill(0, 1, 0); vertex(-1, 1, -1); fill(1, 1, 0); vertex( 1, 1, -1); fill(1, 1, 1); vertex( 1, 1, 1); fill(0, 1, 1); vertex(-1, 1, 1); fill(0, 0, 0); vertex(-1, -1, -1); fill(1, 0, 0); vertex( 1, -1, -1); fill(1, 0, 1); vertex( 1, -1, 1); fill(0, 0, 1); vertex(-1, -1, 1); endShape(); popMatrix(); } // ----------------------------------------------------------------- // hand events void onCreateHands(int handId,PVector pos,float time) { println("onCreateHands - handId: " + handId + ", pos: " + pos + ", time:" + time); handsTrackFlag = true; handVec = pos; handVecList.clear(); handVecList.add(pos); } void onUpdateHands(int handId,PVector pos,float time) { println("onUpdateHandsCb - handId: " + handId + ", pos: " + pos + ", time:" + time); handVec = pos; //add from sample code RGB Cube newXmag = pos.x/float(width) * TWO_PI; newYmag = pos.y/float(height) * TWO_PI; handVecList.add(0,pos); if(handVecList.size() >= handVecListSize) { // remove the last point handVecList.remove(handVecList.size()-1); } } void onDestroyHands(int handId,float time) { println("onDestroyHandsCb - handId: " + handId + ", time:" + time); handsTrackFlag = false; context.addGesture(lastGesture); } // ----------------------------------------------------------------- // gesture events void onRecognizeGesture(String strGesture, PVector idPosition, PVector endPosition) { println("onRecognizeGesture - strGesture: " + strGesture + ", idPosition: " + idPosition + ", endPosition:" + endPosition); lastGesture = strGesture; context.removeGesture(strGesture); context.startTrackingHands(endPosition); } void onProgressGesture(String strGesture, PVector position,float progress) { println("onProgressGesture - strGesture: " + strGesture + ", position: " + position + ", progress:" + progress); } // ----------------------------------------------------------------- // Keyboard event void keyPressed() { switch(key) { case ' ': context.setMirror(!context.mirror()); break; } switch(keyCode) { case LEFT: rotY += 0.1f; break; case RIGHT: 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; } }