GMU:Tutorials/Networking/Controlling Processing with The Captury: Difference between revisions

From Medien Wiki
No edit summary
Line 61: Line 61:
本地接收信息框截图
本地接收信息框截图


*To make sure that all the bones in use are available and refresh them every second or so. And  
*To make sure that all the bones in use are available and refresh them every second or so. And send the message back to the Captury.
<source lang="Java" line start= "58">
<source lang="Java" line start= "58">
void refreshSubscriptions() {
void refreshSubscriptions() {
Line 86: Line 86:


'''PART 03 – Pass data to the object'''
'''PART 03 – Pass data to the object'''
*plug a specific bone
*Define a function to plug a specific bone to a object.
<source lang="Java" line start= "88">
<source lang="Java" line start= "88">
void plugBone(Object target, String skeleton, String bone) {
void plugBone(Object target, String skeleton, String bone) {
Line 94: Line 94:
</source>
</source>


*objects in space
*Declare and construct a object (sphere) from the class Sphere, which is the receiver of the data.
<source lang="Java" line start= "22">
<source lang="Java" line start= "22">
Sphere sphere1;
Sphere sphere1;
Line 100: Line 100:
<source lang="Java" line start= "40">
<source lang="Java" line start= "40">
sphere1 = new Sphere(1);
sphere1 = new Sphere(1);
</source>
<source lang="Java" line start= "68">
sphere1.draw();
</source>
</source>


*pass position of Asha's root bone to the first sphere object
*Use plugBone function to pass position data of LiQianqian's Root bone to the sphere object
<source lang="Java" line start= "50">
<source lang="Java" line start= "50">
plugBone(sphere1, skeleton1, bone1);
plugBone(sphere1, skeleton1, bone1);
Line 108: Line 111:


'''PART 04 – Use the data as a variable'''
'''PART 04 – Use the data as a variable'''
*position of the sphere
*In the class Sphere, define the float variable for the position of the sphere.
<source lang="Java" line start= "3">
<source lang="Java" line start= "3">
float x, y, z;
float x, y, z;
</source>
</source>


*update the position of the root node // (this function will be plugged to OSC
*Update the position of the root node. This function will be plugged to OSC.
<source lang="Java" line start= "48">
<source lang="Java" line start= "48">
public void updateRoot(float x, float y, float z) {
public void updateRoot(float x, float y, float z) {
Line 122: Line 125:
</source>
</source>


== Play The Video By Processing ==
Then you can have a sphere moving follow the data from the Captury! For further application, you can use x, y, z to control whatever you want in Processing!
 
== Control The Video By Processing ==
Since we can successfully use the data from the capture, it can be creatively to use the position of the object to control whatever you want in Processing!  <br>
The following is an example of using a single value (position x) to play or reverse the video and change the play speed of the video.<br>
<br>
'''PART 01 – Play a video in Processing''' <br>
*Basic code to play a video in Processing.
<source lang="Java" line start= "12">
import processing.video.*;  //Import libraries
</source>
<source lang="Java" line start= "16">
Movie myMovie;  //Declare a object as Movie
</source>
 
<source lang="Java" line start= "31">
void setup() {
  size(1920, 1080);  //or use 'fullScreen(P3D);'
  frameRate(60);
  background(0);
  myMovie = new Movie(this, "Chinese Knot_Final.mov");  //Load a movie, normally followed with 'play()' or 'loop()'
}
</source>
*Draw the movie by the class object (Sphere)
<source lang="Java" line start= "22">
void draw() {
    image(myMovie, 0, 0, width, height);  //Position to put the movie
}
</source>
*Called every time a new frame is available to read.
<source lang="Java" line start= "62">
void movieEvent(Movie m) {
  m.read();
}
</source>


'''PART 01 – ''' <br>
'''PART 02 Play or reverse the video and change the play speed''' <br>
*Using position x as the condition. If user stand at the left edge, the speed will be slowest. The righter user stand, the faster the movie play.
*Using position y as the condition. If user stand close to the platform, the movie will play as usual, if else the movie will reverse.
<source lang="Java" line start= "4">
int play;  //Declare a value to judge play or reverse the video
</source>


<source lang="Java">
*Get the total number of the movie frames.
<source lang="Java" line start= "7">
  int getLength() {
      return int(myMovie.duration() * myMovie.frameRate);
  }
</source>


*Get current frame.
<source lang="Java" line start= "11">
  int getFrame() {   
      return ceil(myMovie.time() * 60) - 1;
  }
</source>
</source>


*Pay attention that if the movie play to the end, it must be reversed. And if the movie reverse to the beginning, it must play as usual.
<source lang="Java" line start= "26">
    if(y > 200 && getFrame() < (getLength() - 1)){
      play = 1;
      myMovie.play();
    }
    else {
      play = -1;
      myMovie.play();
    }
    if(getFrame() < 1) myMovie.play();


<br style="clear:both">
    float newSpeed = map(x, 0, 150, 0*play, 2*play);
    myMovie.speed(newSpeed);
</source>


== Let's Enjoy The Example File==
== Let's Enjoy The Example File==