Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#16 2010-03-03 00:19:32 Re : Reactable avec PS3eye/MIDI

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Reactable avec PS3eye/MIDI



Salut Segma,

A priori, si tu te sers de processing pour le feedback, tu n'as pas besoin de vvvv. Processing récupères le flux OSC / TUIO qui sort de reactivision et tu n'as « plus qu'à » afficher tes objets visuels. Ou alors tu as décidé de te passer de reactivison ?

Est ce que tu as essayé le code de demo processing tuio qui est fourni avec la librairie? Dedans il y a le fonctionnement de base pour afficher des marqueurs et des blobs de doigts, il est assez court et c'est une bonne base.

Hors ligne

 

#17 2010-03-03 11:30:01 Re : Reactable avec PS3eye/MIDI

SegmA
membre
Date d'inscription: 2010-02-18
Messages: 11

Re: Reactable avec PS3eye/MIDI



@emoc: Oui je m'en suis servi, j'ai effectué quelques modifs, j'arrive à changer le background de la couleur et de la dimension désirée, j'ai changé le code couleur héxa des objets afin de tester quelques trucs. Mes formes sont très bien détectées et sont dans la couleur que j'ai définie (rouge donc).
J'aimerais tout de même pouvoir changer la forme affichée sur mon écran; par défaut carrée, et pouvoir ajouter quelques effets (de ce type-là: http://vvvv.org/tiki-index.php?page=user+shaders). D'où mon intérêt pour vvvv avec le plugin oscP5 quitte à me passer de ReacTIVision. Mais si quelqu'un à des infos sur la modification directe des objets détectés via processing (forme rondes, effets visuels autour de l'objet etc), hésitez pas à m'en tenir au courant !

Et j'oubliais de te remercier emoc! Sympa de voir qu'il y a encore des admins qui sont concernés/s'intéressent aux projets des autres! smile


Juste pour le fun, j'ai fais ça:





lien vers la page de la vidéo sur youtube

Dernière modification par SegmA (2010-03-03 11:36:04)

Hors ligne

 

#18 2010-03-03 23:34:35 Re : Reactable avec PS3eye/MIDI

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Reactable avec PS3eye/MIDI



Salut,

Quelques explications pour modifier la tuio demo et aller vers ce que tu veux. Voila une version modifiée de la demo :

Code (p5) :

/*
    TUIO processing demo - part of the reacTIVision project
    http://reactivision.sourceforge.net/

    Copyright (c) 2005-2009 Martin Kaltenbrunner <mkalten@iua.upf.edu>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

// we need to import the TUIO library
// and declare a TuioProcessing client variable
import TUIO.*;
TuioProcessing tuioClient;

// these are some helper variables which are used
// to create scalable graphical feedback
float cursor_size = 15;
float object_size = 60;
float table_size = 760;
float scale_factor = 1;
PFont font;

void setup()
{
  //size(screen.width,screen.height);
  size(640,480);
  noStroke();
  fill(0);
  
  loop();
  frameRate(30);
  //noLoop();
  
  hint(ENABLE_NATIVE_FONTS);
  font = createFont("Arial", 18);
  scale_factor = height/table_size;
  
  // we create an instance of the TuioProcessing client
  // since we add "this" class as an argument the TuioProcessing class expects
  // an implementation of the TUIO callback methods (see below)
  tuioClient  = new TuioProcessing(this);
}

// within the draw method we retrieve a Vector (List) of TuioObject and TuioCursor (polling)
// from the TuioProcessing client and then loop over both lists to draw the graphical feedback.
void draw()
{
  background(0);
  textFont(font,18*scale_factor);
  float obj_size = object_size*scale_factor; 
  float cur_size = cursor_size*scale_factor; 
   
  Vector tuioObjectList = tuioClient.getTuioObjects();
  for (int i=0;i<tuioObjectList.size();i++) {
     TuioObject tobj = (TuioObject)tuioObjectList.elementAt(i);
     stroke(0);
     fill(0);
     pushMatrix();
     translate(tobj.getScreenX(width),tobj.getScreenY(height));
     rotate(tobj.getAngle());
     drawObject(obj_size, tobj.getAngle());
     //rect(-obj_size/2,-obj_size/2,obj_size,obj_size);
     popMatrix();
     fill(255);
     text(""+tobj.getSymbolID(), tobj.getScreenX(width), tobj.getScreenY(height));
   }
   
   Vector tuioCursorList = tuioClient.getTuioCursors();
   for (int i=0;i<tuioCursorList.size();i++) {
      TuioCursor tcur = (TuioCursor)tuioCursorList.elementAt(i);
      Vector pointList = tcur.getPath();
      
      if (pointList.size()>0) {
        stroke(0,0,255);
        TuioPoint start_point = (TuioPoint)pointList.firstElement();;
        for (int j=0;j<pointList.size();j++) {
           TuioPoint end_point = (TuioPoint)pointList.elementAt(j);
           line(start_point.getScreenX(width),start_point.getScreenY(height),end_point.getScreenX(width),end_point.getScreenY(height));
           start_point = end_point;
        }
        
        stroke(192,192,192);
        fill(192,192,192);
        ellipse( tcur.getScreenX(width), tcur.getScreenY(height),cur_size,cur_size);
        fill(0);
        text(""+ tcur.getCursorID(),  tcur.getScreenX(width)-5,  tcur.getScreenY(height)+5);
      }
   }
   
}

void drawObject(float obj_size, float rot) {
  colorMode(HSB);
  for (float i=0; i<= TWO_PI; i++) {
    float x = random(20) * rot * cos(i);
    float y = random(20) * rot * sin(i);
    fill (rot * 40, 200, rot * 20 + 100);
    ellipse(x, y, rot*5, rot*5);
  }
}

// these callback methods are called whenever a TUIO event occurs

// called when an object is added to the scene
void addTuioObject(TuioObject tobj) {
  println("add object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle());
}

// called when an object is removed from the scene
void removeTuioObject(TuioObject tobj) {
  println("remove object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+")");
}

// called when an object is moved
void updateTuioObject (TuioObject tobj) {
  println("update object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle()
          +" "+tobj.getMotionSpeed()+" "+tobj.getRotationSpeed()+" "+tobj.getMotionAccel()+" "+tobj.getRotationAccel());
}

// called when a cursor is added to the scene
void addTuioCursor(TuioCursor tcur) {
  println("add cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+ ") " +tcur.getX()+" "+tcur.getY());
}

// called when a cursor is moved
void updateTuioCursor (TuioCursor tcur) {
  println("update cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+ ") " +tcur.getX()+" "+tcur.getY()
          +" "+tcur.getMotionSpeed()+" "+tcur.getMotionAccel());
}

// called when a cursor is removed from the scene
void removeTuioCursor(TuioCursor tcur) {
  println("remove cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+")");
}

// called after each message bundle
// representing the end of an image frame
void refresh(TuioTime bundleTime) { 
  redraw();
}

En fait, il n'y a qu'un petit changement : au lieu d'afficher le marqueur par rect(), on le remplace par une fonction qui va faire un affichage personnalisé. Ici c'est drawObject qui "dessine" la forme associée au marqueur en fonction de 2 paramètres transmis par tuio (la taille et la rotation):

Code (p5) :

void drawObject(float obj_size, float rot) {
  colorMode(HSB);
  for (float i=0; i<= TWO_PI; i++) {
    float x = random(20) * rot * cos(i);
    float y = random(20) * rot * sin(i);
    fill (rot * 40, 200, rot * 20 + 100);
    ellipse(x, y, rot*5, rot*5);
  }
}

A toi de mettre ce que tu veux dans cette fonction!

Maintenant, si tu veux aller plus loin, il faut donner une certaine persistence aux objets, qu'ils ne soient pas redessinés depuis rien à chaque boucle de draw(). L'idéal pour ça, c'est de créer une classe qui représente tes objets, d'instancier chacun, et de mettre à jour les paramètres en fonction des infos transmises par tuio (position, affiché / pas affiché). Une fois que c'est fait, tu as un espace 2D ou 3D, avec des objets que tu peux faire interagir selon les règles que tu veux. Si tu ne veux pas te lancer dans la programmation avec objets, tu peux aussi utiliser un tableau / array et y stocker des paramètres.

Hors ligne

 

#19 2010-03-04 11:16:20 Re : Reactable avec PS3eye/MIDI

SegmA
membre
Date d'inscription: 2010-02-18
Messages: 11

Re: Reactable avec PS3eye/MIDI



Emoc je te remercie une fois de plus, grâce à ton exemple j'ai pu plus comprendre le fonctionnement global de processing!
Je me suis amusé à faire quelques changements, pour voir les limites et les capacités de cette prog.
Je n'en dis pas plus, je suis des tutoriels pour aller plus loin; je repasserais avec une vidéo quand j'aurais bien poussé ma bête ^^!
A bientôt,

SegmA`

Hors ligne

 

#20 2010-03-05 06:09:57 Re : Reactable avec PS3eye/MIDI

videoactif
membre
Lieu: Morteau
Date d'inscription: 2010-01-27
Messages: 52

Re: Reactable avec PS3eye/MIDI



cool ton projet, ça me donne envie de me mettre au k'nex

Dernière modification par videoactif (2010-03-05 06:10:21)


Programming is like sex: one mistake and you’re providing support for a lifetime.  Michael Sinz

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024