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
@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!
Juste pour le fun, j'ai fais ça:
Dernière modification par SegmA (2010-03-03 11:36:04)
Hors ligne
Salut,
Quelques explications pour modifier la tuio demo et aller vers ce que tu veux. Voila une version modifiée de la demo :
/* 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):
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
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
cool ton projet, ça me donne envie de me mettre au k'nex
Dernière modification par videoactif (2010-03-05 06:10:21)
Hors ligne
Pages: 1 2