|
» codelab : http://codelab.fr/accueil » Forum : Table réactive + Multi-touch : http://codelab.fr/table-reactive-multitouch » Reactable avec PS3eye/MIDI : http://codelab.fr/1537 Ceci est la version imprimable d'un sujet du forum, pour retourner à la version complète : Reactable avec PS3eye/MIDI |
| SegmA — 2010-02-18 23:23:22 |
Bonsoir à tous! lien vers la page de la vidéo sur youtube Ma table marche plutôt bien; pour l'instant en midi donc, sous FL9 et Reason 4 aucun problèmes notables. Je souhaitais m'attaquer au feedback vidéo; mais me rendant compte qu'un vidéo-projecteur n'était pas dans mes moyens pour le moment, une question m'est venue. Vu que le retour se fait avec une source lumineuse (logique je sais!); pourrais-je, à votre avis, utiliser un moniteur LCD (que j'ai en rab'); le fixer sous ma plaque de verre, et avoir un rendu <<passable>>?! Mon idée n'est peut-être pas nouvelle, mais je voudrais savoir si quelqu'un l'a déjà réalisée, et si c'est à recommander ou non! Si cela s'avêrait positif, peut-être serait-il bénéfique de supprimer le cadre du moniteur, avec de gagner quelques précieux millimètres... Bref, c'est un projet qui me tient à coeur, j'en apprends beaucoup ici et là, et je trouve que l'idée de réunir les créateurs de réactable DIY une excellente idée! Merci à ceux qui prendront la peine de me répondre ;) |
| emoc — 2010-02-19 14:35:34 |
Bonjour SegmA et bienvenue! |
| SegmA — 2010-02-19 18:53:27 |
Tout d'abord, merci de ta réponse très rapide; et de l'accueil ! |
| SegmA — 2010-02-22 19:39:47 |
Me revoici! |
| teofil — 2010-02-22 20:34:28 |
C'est ça. Plus la définition est élevée, et plus le nombre de frames par seconde (fps) est élevé, et meilleur sera la détection des fiducials, tant en réactivité (la vitesse à laquelle tu les bouges), qu'en taille (plus ils sont petits, plus il sera difficile pour reactivision de les reconnaître). |
| SegmA — 2010-02-22 20:59:23 |
En effet, c'est énorme; je vais y réfléchir, ça paraît vraiment du bon ! |
| SegmA — 2010-02-24 16:42:15 |
Allez, je reviens vous larguer une petite série de photos de mon avancée! |
| pob — 2010-02-24 18:34:12 |
Je n'ai absolument aucun soucis sous windows7 64bits avec la PS3Eye. Mon ordi est léger côté CPU : Tablet PC Lenovo x61t. On est en Core2Duo LV à 1,6GHz par noyau. Donc très léger... |
| SegmA — 2010-02-24 19:51:09 |
En effet, voici des tests que j'ai pu effectuer en fin d'aprem (et ENFIN le son enregistré est en bonne qualité!!! :cool:) lien vers la page de la vidéo sur youtube Je trouve le rendu bon pour 15fps. :D Disons que tant qu'à faire, j'aurais aimé avoir la meilleure fluidité, le meilleur tracking de mes fiducials. Mais il est vrai que pour ce que je vais en faire, les 15fps voir 30 me suffisent amplement! Des améliorations seront à faire du côté <options> de la caméra: on peut le voir sur la vidéo, certains knob réagissent un peu tardivement; mais ce ne sont que de petites modifs, le résultat produit me convient parfaitement. Pour le feedback vidéo, dès que j'ai l'occasion de récupérer un vidéo projecteur je me lance; je scierai mon meuble et ferai tout le nécessaire (LED IR etcetc...) ;) |
| emoc — 2010-02-25 10:53:12 |
:) |
| SegmA — 2010-02-26 16:25:22 |
Je repasse dans le coin pour vous informer que je me lance dans le feedback vidéo afin de tester la chose. |
| xray303 — 2010-02-26 17:50:55 |
hello, |
| SegmA — 2010-02-26 17:56:00 |
@xray303: puredata/GEM/Fid_Abs, le taff d'asurmen m'ayant réellement bluffé ! |
| xray303 — 2010-03-01 01:11:51 |
Hello, |
| SegmA — 2010-03-02 15:47:13 |
Bon bon bon, je repasse dans le coin; je me suis "lancé" dans le feedback vidéo, et je ne pensais vraiment pas passer tant de temps à coder ça. On a rien sans rien comme dirait l'autre. |
| emoc — 2010-03-03 00:19:32 |
Salut Segma, |
| SegmA — 2010-03-03 11:30:01 |
@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). lien vers la page de la vidéo sur youtube |
| emoc — 2010-03-03 23:34:35 |
Salut, 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! |
| SegmA — 2010-03-04 11:16:20 |
Emoc je te remercie une fois de plus, grâce à ton exemple j'ai pu plus comprendre le fonctionnement global de processing! |
| videoactif — 2010-03-05 06:09:57 |
cool ton projet, ça me donne envie de me mettre au k'nex |