|  |  | 
| Line 29: | Line 29: | 
|  | communication between Captury System and Processing. <br> |  | communication between Captury System and Processing. <br> | 
|  | 
 |  | 
 | 
|  | import oscP5.*;
 |  | 
|  | import netP5.*;
 |  | 
|  | 
 |  | 
|  | OscP5 oscP5;
 |  | 
|  | NetAddress myRemoteLocation; // IP of Computer running captury, Port configured in software
 |  | 
|  | 
 |  | 
|  | 
 |  | 
|  | long lastMillis=0; // used to periodically send subscribe messages
 |  | 
|  | ArrayList <PVector> joints=new ArrayList <PVector>(); // used to buffer joint positions between oscEvent callbacks and "draw" calls
 |  | 
|  | 
 |  | 
|  | void setup() {
 |  | 
|  | fullScreen();
 |  | 
|  | //size(800, 600);
 |  | 
|  | oscP5 = new OscP5(this, 1065);
 |  | 
|  | myRemoteLocation = new NetAddress("141.54.159.160", 1065); // our computer...}
 |  | 
|  | void draw() {
 |  | 
|  | // periodically ask the captury server to send us data.
 |  | 
|  | if (millis()-lastMillis>5000) {
 |  | 
|  |     // The format is as follows:
 |  | 
|  |     //"/subscribe/<Actor_name>/<skeleton_data_type>/<joint_name>/<data_format>"
 |  | 
|  |     //most of the placeholders can be replaced by a "*" for "everything"
 |  | 
|  |     // unfortunately, if you subscribe to too many things, a bug in the captury will lead to malformed OSC-bundles that in turn crash OSCP5
 |  | 
|  | OscMessage myMessage = new OscMessage("/subscribe/*/blender/Head/vector"); // get positions ("vector") of all joints of actor "felix_braun_rot" in mm
 |  | 
|  | oscP5.send(myMessage, myRemoteLocation);}
 |  | 
|  | 
 |  | 
|  |   strokeWeight(4);  
 |  | 
|  |   // go through list of joints and draw them all
 |  | 
|  |   frameRate(5);
 |  | 
|  |   fill(101, 50);
 |  | 
|  |   stroke(255, 30);
 |  | 
|  |   background(0);
 |  | 
|  |   for (int i=0; i<joints.size(); i++) {
 |  | 
|  |     //draw everything here
 |  | 
|  |     point(joints.get(i).x/5+width/2, joints.get(i).y/5+height/2);
 |  | 
|  |     line(random(600), random(600), joints.get(i).x/5+width/2, joints.get(i).y/5+height/2);}
 |  | 
|  |     joints.clear();}
 |  | 
|  | 
 |  | 
|  | /* incoming osc message are forwarded to the oscEvent method. */
 |  | 
|  | void oscEvent(OscMessage theOscMessage) {
 |  | 
|  |   println(theOscMessage); // debug out
 |  | 
|  |   // only use packages that contain position data as three floats
 |  | 
|  |   if (theOscMessage.checkTypetag("fff")) {
 |  | 
|  |     joints.add(new PVector(theOscMessage.get(0).floatValue(), theOscMessage.get(1).floatValue(), theOscMessage.get(2).floatValue()));
 |  | 
|  |     println( theOscMessage.get(0).floatValue());
 |  | 
|  |     println( theOscMessage.get(1).floatValue());
 |  | 
|  |     println( theOscMessage.get(2).floatValue());}}
 |  | 
|  | 
 |  | 
 | 
|  | 
 |  | 
 | 
|  | This Processing Sketch show how OSC protocol is used and how our draw function is inserted inside that protocol. |  | This Processing Sketch show how OSC protocol is used and how our draw function is inserted inside that protocol. | 
|  | First of all oscP5 and netP5 libraries are imported inside the sketch.In order to use OSC protocol we have to import those library. There are 3 messages received from Captury, they are x,y,z coordinates of the tracked person locations. |  | First of all oscP5 and netP5 libraries are imported inside the sketch.In order to use OSC protocol we have to import those library. There are 3 messages received from Captury, they are x,y,z coordinates of the tracked person locations. |