domenica 27 febbraio 2011

Processing| Interfacciamo il Wiimote


Una delle novità più importanti degli ultimi 10 anni nel campo delle console è stato, senza dubbio, il Wiimote: il rivoluzionario controller Wii che consente al giocatore di interaggire con il gioco usando i movimenti del proprio corpo.
Gli accelerometri presenti nel controller hanno permesso lo sviluppo di giochi molto "pratici", basti pensare a come WiiSport permetta di giocare a baseball o a tennis, impugnando il telecomando come se fosse una mazza o una racchetta e facendo compiere al personaggio del gioco gli stessi movimenti fatti dal giocatore "reale"; cosa impensabile un tempo.

Cosa vogliamo fare
Un semplice programma che permetta di visualizzare i movimenti del Wiimote; ho pensato di utilizzare il Wiimote per ruotare un cubo colorato.

Come lo vogliamo fare
Lo farò con Processing, che forse conoscerete già e che consentirà di creare il programma senza dover spendere troppe righe di codice. L'ho conosciuto grazie ad Arduino, e non è male!
Iniziamo!

Le librerie
Prima di tutto è necessario installare l varie librerie, che sono:
Bluecove: permette al nostro programma Java di interfacciarsi con l'hardware bluetooth del sistema.
Ci servono i file bluecove-2.1.0.jar , bluecove-gpl-2.1.0.jar
WiiRemoteJ: Si tratta di una libreria Java che consente di interfacciare il Wiimote con il programma Java.
Ci serve il file WiiremoteJ.jar
Wrj4p5: Libreria che converte le informazioni ottenute da WiiRemoteJ in qualcosa di più semplice da usare con processing :)
Ci servono Wrj4p5.jar e Loc.jar


Per prima cosa copiamo i file bluecove-2.1.0.jar, bluecove-gpl-2.1.0.jar e WiiRemoteJ.jar nella cartella contenente le librerie di Java. Nel mio caso si trova in /usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/ 
Poi nelle cartella delle librerie di processing (processing-***/libraries) creiamo la cartella wrj4P5 e la sottocartella library.
Qui dentro copiamo i file bluecove-2.1.0.jar, bluecove-gpl-2.1.0.jar, Loc.jar, WiiRemoteJ.jar, wrj4P5.jar.
Finito?
No. E' necessario installare anche il pacchetto libbluetooth-dev, e quindi diamo un bel:
sudo apt-get install libbluetooth-dev

Finito? Sì :D

Il programma
Ed ecco il programma: si tratta dell'esempio sul cubo RGB presente nel sito di Processing modificato in modo da utilizzare i dati di rotazione del Wiimote invece che il mouse per gestire la rotazione.
import lll.wrj4P5.*; //importa libreria 
Wrj4P5 wii; //crea un nuovo oggetto
float xmag, ymag = 0; 
float newXmag, newYmag = 0;
float x=1; 
void setup() { 
 size(640, 360, P3D);
 noStroke(); 
 colorMode(RGB, 1); 
 wii=new Wrj4P5(this); 
 wii.connect(); //cerca il wiimote 
} 
 
void draw() { 
 background(0.5); 
 pushMatrix(); 
 translate(width/2, height/2, -30); 
 newXmag = (wii.rimokon.senced.x*150)/float(width) * TWO_PI; 
 newYmag = (wii.rimokon.senced.y*150)/float(height) * TWO_PI; 
 float diff = xmag-newXmag;
 if (abs(diff) >  0.01) { xmag -= diff/4.0; } 
 
 diff = ymag-newYmag;
 if (abs(diff) >  0.01) { ymag -= diff/4.0; } 
 
 rotateX(-ymag); 
 rotateY(-xmag); 
 scale(90); 
 beginShape(QUADS);
 
 fill(0, 1, 1); vertex(-1,  1,  1); 
 fill(1, 1, 1); vertex( 1,  1,  1); 
 fill(1, 0, 1); vertex( 1, -1,  1); 
 fill(0, 0, 1); vertex(-1, -1,  1);
 
 fill(1, 1, 1); vertex( 1,  1,  1);
 fill(1, 1, 0); vertex( 1,  1, -1);
 fill(1, 0, 0); vertex( 1, -1, -1);
 fill(1, 0, 1); vertex( 1, -1,  1); 
 
 fill(1, 1, 0); vertex( 1,  1, -1);
 fill(0, 1, 0); vertex(-1,  1, -1);
 fill(0, 0, 0); vertex(-1, -1, -1);
 fill(1, 0, 0); vertex( 1, -1, -1);
 
 fill(0, 1, 0); vertex(-1,  1, -1);
 fill(0, 1, 1); vertex(-1,  1,  1);
 fill(0, 0, 1); vertex(-1, -1,  1);
 fill(0, 0, 0); vertex(-1, -1, -1);
 
 fill(0, 1, 0); vertex(-1,  1, -1);
 fill(1, 1, 0); vertex( 1,  1, -1);
 fill(1, 1, 1); vertex( 1,  1,  1); 
 fill(0, 1, 1); vertex(-1,  1,  1); 
 
 fill(0, 0, 0); vertex(-1, -1, -1);
 fill(1, 0, 0); vertex( 1, -1, -1);
 fill(1, 0, 1); vertex( 1, -1,  1); 
 fill(0, 0, 1); vertex(-1, -1,  1); 
 
 endShape();
 popMatrix();  

0 commenti:

^