We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Dear all, I've connected this code to the kinect, what happens is that cause I map the rotation of the cubes to the distance of the hands, they all rotate at the same time and with same degree of rotation. Originally I had map the rotation to distance between each element to mouse so it was gradual and different. Here I started creating an array and a function so that the kinect sends the data with certain delay to each element so they rotate differently
void trailTempo(float new_value) {
for ( int i = 0; i < arrayTempoXrotation.length; ++i )
{
// pass old value to previous array slot
if(i>0) arrayTempoXrotation[i-1] = arrayTempoXrotation[i];
//set to last value the new value
if(i==(arrayTempoXrotation.length-1))arrayTempoXrotation[i] = new_value;
}
}
but I got stuck not sure how to assign it. Another question is how can I control the peasyCam with the hands instead of with the mouse. Any help greatly appreciated!!!!
//kinect code import kinect4WinSDK.Kinect; import kinect4WinSDK.SkeletonData; Kinect kinect; ArrayList bodies; PVector shoulder = new PVector(); PVector handLeft = new PVector(); PVector handRight = new PVector(); // paola code import processing.pdf.*; import peasy.*; //--------------------------------for 3d environment PeasyCam cam; PMatrix3D currCameraMatrix; PGraphics3D g3; //-------------------------------- boolean record; ArrayList manyOmetti = new ArrayList(); boolean cambiaRotazioneOmetti=true; boolean stretchOmetti=false; float variazioneX; float Xref, Yref, Zref;//------------------------------- int direct=1; float mov; // variabili x fare cambio di file usando tempo float lastMillis; float timer; float durata=50000; float durata2=100000; float durata3=150000; boolean spazio=true; boolean movimentoQuality=true; boolean rotX=true; // ARRAY AVERAGE para ke valores kinect no sean tan locos float[] arrayDistance; float[] arrayTempoXrotation; // default setup int averageSampling = 100; int sampleOmetti = 182; void setup() { size(900, 700, P3D); //------------------------------------P3D for 3d frameRate(30); smooth(); //------------------------------------camSettings g3 = (PGraphics3D)g; cam = new PeasyCam(this,800,800,0, 1500); /*los valores de la camara van al reves que e los del screen de processing para que salga arriba es + y para abajo es -*/ cam.setMinimumDistance(1100); cam.setMaximumDistance(2000); //------------------------------------ Xref= 0; Yref= height/2; Zref=0;//------------------------------- //variabili kinect kinect = new Kinect(this); smooth(); bodies = new ArrayList(); //variabili durata x creare struttura temporale timer=millis(); //EL ARRAY arrayDistance = new float[averageSampling]; for ( int i = 0; i < arrayDistance.length; ++i ) { arrayDistance[i]= 0.0; } arrayTempoXrotation = new float[sampleOmetti]; for ( int i = 0; i < arrayTempoXrotation.length; ++i ) { arrayTempoXrotation[i]= 0.0; } } void draw() { background(#F2F1E8); mov=map(mouseX, 0, width, 0.3, 1.5); // questo e`il punto di riferenza che ora ho tolto e messo il map alla kinect //pero muove lo spazio e gli da molta + dinamica Xref+=mov*direct; if (Xref>width||Xref<0) { direct*=-1; } // struttura timer if(millis()-timer<durata){ spazio=true; movimentoQuality=true; } else if(millis()-timer>durata &&millis()-timerdurata2 &&millis()-timerdurata3){ timer=millis(); } //we add a box to the bottom of the sketch as a "reference" pushMatrix(); noFill(); stroke(1); strokeWeight(1); translate(width/2, height/2, 0); // box(width-10, height-10, 1); popMatrix(); translate(Xref, Yref, Zref);//------------------------------------ sphere( 10);//------------------------------------ iniziaMarkers2(); for (Ometti ometti : manyOmetti) { ometti.display(); } //KINECT CODE cam.beginHUD(); image(kinect.GetImage(), 320, 0, 320, 240); image(kinect.GetDepth(), 320, 240, 320, 240); image(kinect.GetMask(), 0, 240, 320, 240); cam.endHUD(); for (int i=0; i0) arrayDistance[i-1] = arrayDistance[i]; //set to last value the new value if(i==(arrayDistance.length-1))arrayDistance[i] = new_value; } // This is where we compute the average float average = 0; for ( int i = 0; i < arrayDistance.length; ++i ) { average += arrayDistance[i]; } average /= (float)(arrayDistance.length); // The average should be close to zero return average; } void trailTempo(float new_value) { for ( int i = 0; i < arrayTempoXrotation.length; ++i ) { // pass old value to previous array slot if(i>0) arrayTempoXrotation[i-1] = arrayTempoXrotation[i]; //set to last value the new value if(i==(arrayTempoXrotation.length-1))arrayTempoXrotation[i] = new_value; } } void getData(String csvFile) { manyOmetti.clear(); String[] lines = loadStrings(csvFile); String data = join(lines, ","); String[] e = split(data, ","); // println(e.length); for (int i = 0; i < e.length; i += 5) { float x = Float.valueOf(e[i+1]); float y = Float.valueOf(e[i+2]); float z = Float.valueOf(e[i+1]);//------------------------------------random value here for Z float r = Float.valueOf(e[i+3]); float scala = Float.valueOf(e[i+4]); if (e[i].equals("O")) manyOmetti.add(new Ometti(x, y, z, scala, r)); } } void iniziaMarkers2() { if (spazio==true) { getData("omettiAli.csv"); } else if (spazio==false) { getData("Ali4Aprile.csv"); } } void keyPressed() { if (key=='t') { cambiaRotazioneOmetti=!cambiaRotazioneOmetti; } if (key=='s') { stretchOmetti=!stretchOmetti; } if (key=='p') { String image_name = day()+""+hour()+""+minute()+""+second()+""+millis()+".png"; save(image_name); } //PDF if (key=='m') { beginRecord(PDF, "frame-####.pdf"); record = true; } if (key=='n') { endRecord(); record= false; } } class Ometti { float colore; float x, y, z, rotazione;// ---------------------------- z axis added here float grossore=1; int A=-200, B=-200; Ometti(float positionX_, float positionY_, float positionZ_, float grossore_, float rotazio) {// ---------------------------- added z here z=positionZ_;// ---------------------------- x=positionX_; y=positionY_; grossore=grossore_; rotazione=rotazio; } void display() { float d = dist(handLeft.x,handLeft.y, handRight.x,handRight.y); println(d); //TESTING col maxdist x capire perche quello senza kinect si muove bellissimo e // questo fa un po cagare //float maxDist= dist(0, 0, width/2, height/2); if (cambiaRotazioneOmetti==true) { //kinect map rotazione=map(d, 0.01,0.7, 0, 8); //questo se suppone è corretto // rotazione=map(d, 0, maxDist, 0, 8); //println(d); } else if (cambiaRotazioneOmetti==false) { rotazione=rotazione; } pushMatrix(); translate(x+variazioneX, y, z); if(movimentoQuality==false){ rotate(rotazione); } else if(movimentoQuality==true&& rotX==true){ rotateX(rotazione); } else if(movimentoQuality==true&& rotX==false){ rotateY(rotazione); } scale(grossore); strokeWeight (2); stroke(0); rectMode(CENTER); //fill(255, 0, 0, 111); fill(#2555D6,201); //azul stroke( 0); strokeWeight(1); // rect(A+200,B+200,170,15); translate (170, 15, 0 );//------------------------------------box method instead of a rect box(A+220, B+220, 250);//------------------------------------ translate(A+200, B+200, 10);//------------------------------------sphere method added // stroke(mouseX * 2, 0, 210);//added this line for color code fill(#F7057E,100); stroke(200); // sphere(30); float grandezza=map(d,0.01,0.7,30,100); sphere(grandezza); stroke(0); strokeWeight(5); line(A+190, B+190, 50, A+220, B+190, 50);//------------------------------------ point(A+215, B+220); popMatrix(); } } void drawPosition(SkeletonData _s) { noStroke(); fill(0, 100, 255); String s1 = str(_s.dwTrackingID); text(s1, _s.position.x*width/2, _s.position.y*height/2); } void drawSkeleton(SkeletonData _s) { // Body DrawBone(_s, Kinect.NUI_SKELETON_POSITION_HEAD, Kinect.NUI_SKELETON_POSITION_SHOULDER_CENTER); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_CENTER, Kinect.NUI_SKELETON_POSITION_SHOULDER_LEFT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_CENTER, Kinect.NUI_SKELETON_POSITION_SHOULDER_RIGHT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_CENTER, Kinect.NUI_SKELETON_POSITION_SPINE); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_LEFT, Kinect.NUI_SKELETON_POSITION_SPINE); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_RIGHT, Kinect.NUI_SKELETON_POSITION_SPINE); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SPINE, Kinect.NUI_SKELETON_POSITION_HIP_CENTER); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_HIP_CENTER, Kinect.NUI_SKELETON_POSITION_HIP_LEFT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_HIP_CENTER, Kinect.NUI_SKELETON_POSITION_HIP_RIGHT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_HIP_LEFT, Kinect.NUI_SKELETON_POSITION_HIP_RIGHT); // Left Arm DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_LEFT, Kinect.NUI_SKELETON_POSITION_ELBOW_LEFT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_ELBOW_LEFT, Kinect.NUI_SKELETON_POSITION_WRIST_LEFT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_WRIST_LEFT, Kinect.NUI_SKELETON_POSITION_HAND_LEFT); // Right Arm DrawBone(_s, Kinect.NUI_SKELETON_POSITION_SHOULDER_RIGHT, Kinect.NUI_SKELETON_POSITION_ELBOW_RIGHT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_ELBOW_RIGHT, Kinect.NUI_SKELETON_POSITION_WRIST_RIGHT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_WRIST_RIGHT, Kinect.NUI_SKELETON_POSITION_HAND_RIGHT); // Left Leg DrawBone(_s, Kinect.NUI_SKELETON_POSITION_HIP_LEFT, Kinect.NUI_SKELETON_POSITION_KNEE_LEFT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_KNEE_LEFT, Kinect.NUI_SKELETON_POSITION_ANKLE_LEFT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_ANKLE_LEFT, Kinect.NUI_SKELETON_POSITION_FOOT_LEFT); // Right Leg DrawBone(_s, Kinect.NUI_SKELETON_POSITION_HIP_RIGHT, Kinect.NUI_SKELETON_POSITION_KNEE_RIGHT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_KNEE_RIGHT, Kinect.NUI_SKELETON_POSITION_ANKLE_RIGHT); DrawBone(_s, Kinect.NUI_SKELETON_POSITION_ANKLE_RIGHT, Kinect.NUI_SKELETON_POSITION_FOOT_RIGHT); } void DrawBone(SkeletonData _s, int _j1, int _j2) { noFill(); stroke(255, 255, 0); if (_s.skeletonPositionTrackingState[_j1] != Kinect.NUI_SKELETON_POSITION_NOT_TRACKED && _s.skeletonPositionTrackingState[_j2] != Kinect.NUI_SKELETON_POSITION_NOT_TRACKED) { line(_s.skeletonPositions[_j1].x*width/2, _s.skeletonPositions[_j1].y*height/2, _s.skeletonPositions[_j2].x*width/2, _s.skeletonPositions[_j2].y*height/2); } } void appearEvent(SkeletonData _s) { if (_s.trackingState == Kinect.NUI_SKELETON_NOT_TRACKED) { return; } synchronized(bodies) { bodies.add(_s); } } void disappearEvent(SkeletonData _s) { synchronized(bodies) { for (int i=bodies.size ()-1; i>=0; i--) { if (_s.dwTrackingID == bodies.get(i).dwTrackingID) { bodies.remove(i); } } } } void moveEvent(SkeletonData _b, SkeletonData _a) { if (_a.trackingState == Kinect.NUI_SKELETON_NOT_TRACKED) { return; } synchronized(bodies) { for (int i=bodies.size ()-1; i>=0; i--) { if (_b.dwTrackingID == bodies.get(i).dwTrackingID) { bodies.get(i).copy(_a); break; } } } }