En este ejemplo de programa HOST se pinta un círculo en el tabletop 1. La superficie del tabletop está dividida en 3 áreas. El color del círculo cambia a rojo, verde o azul, dependiendo de si el fiducial 1 se pone en el área de la izquierda, en el área del centro o en el área de la derecha, respectivamente. Además, dependiendo de la posición vertical del fiducial en el tabletop, el círculo tendrá más, o menos, intensidad.
Fichero displays.xml
<xml> <virtualDisplay width="1600" height="1200"> <display id="1" x="0" y="0" width="800" height="600" /> <display id="2" x="800" y="0" width="800" height="600" /> <display id="3" x="0" y="600" width="800" height="600" /> <display id="4" x="800" y="600" width="800" height="600" /> </virtualDisplay> </xml>
Fichero TUIML.xml <juguemos> <token name="tabletop1"> <constraint name="todo" type= "2D" list_vertex="0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0"> <tac subtoken="1"/> </constraint> <constraint name="izquierda" type= "2D" list_vertex="0.0,0.0,0.33,0.0,0.33,1.0,0.0,1.0,0.0,0.0"> <tac subtoken="1"/> </constraint> <constraint name="centro" type= "2D" list_vertex="0.33,0.0,0.66,0.0,0.66,1.0,0.33,1.0,0.33,0.0"> <tac subtoken="1"/> </constraint> <constraint name="derecha" type= "2D" list_vertex="0.66,0.0,1.0,0.0,1.0,1.0,0.66,1.0,0.66,0.0"> <tac subtoken="1"/> </constraint> <subtoken idG="1"/> </token> </juguemos>
Codigo Host en Proccessing
int ANCHO=1600; int ALTO=1200; int opcion = 0; int intensidad = 255; boolean verb = true; TACAPI miAPI; DisplaysHost displaysClient; void setup() { // Keystone will only work with P3D or OPENGL renderers, // since it relies on texture mapping to deform //fullScreen( P3D); size(600, 400, P3D); frameRate(16); miAPI = new TACAPI(); //virtual screens displaysClient = new DisplaysHost("host"); } void draw() { displaysClient.beginDraw(); if(opcion == 1) displaysClient.elipse(400,300,200,200,255,0,0,intensidad); else { if(opcion == 2) displaysClient.elipse(400,300,200,200,0,255,0,intensidad); else { if(opcion == 3) displaysClient.elipse(400,300,200,200,0,0,255,intensidad); else displaysClient.elipse(400,300,200,200,255,255,255,intensidad); } } displaysClient.endDraw(); } void eventoTAC(TAC ta) { ta.info(); if(ta.getManipulacion().equals("move") && ta.getSubtokenName().equals("1")) { float valorY = ta.getValores().get(1); //0: coordenada x; 1: coordenada y intensidad = int(map(valorY,0.0,1.0,0.0,255.0)); if(ta.getConstraintName().equals("izquierda")) opcion = 1; if(ta.getConstraintName().equals("centro")) opcion = 2; if(ta.getConstraintName().equals("derecha")) opcion = 3; } } void mensajeRecibido(OscMessage theOscMessage) { } void keyPressed() { switch(key) { case ESC: displaysClient.disconnect(); super.stop(); break; } }
Retos de aprendizaje
Documentación
- elipse
Este método permite dibujar una elipse del color especificado, con o sin contorno ( del color que se indique) y del tamaño que se desee. Los parámetros que recibe son los siguientes:
float x: posición del centro de la elipse en el eje X (2D).
float y: posición del centro de la elipse en el eje Y (2D).
int ancho: anchura de la elipse que se va a dibujar.
int alto: altura de la elipse que se va a dibujar.
int rrell: valor de la componente rojo del color con el que se pintará el relleno de la elipse. Valores: 0-255.
int grell: valor de la componente verde del color con el que se pintará el relleno de la elipse. Valores: 0-255.
int brell: valor de la componente azul del color con el que se pintará el relleno de la elipse. Valores: 0-255.
int alpharell: opacidad del relleno de la elipse que se va a dibujar. Valores: 0 (transparente) – 255 (opaco)
int grosor (OPCIONAL): grosor del contorno de la elipse a dibujar.
int rcon (OPCIONAL): valor de la componente rojo del color con el que se pintará el contorno de la elipse. Valores: 0-255.
int gcon (OPCIONAL): valor de la componente verde del color con el que se pintará el contorno de la elipse. Valores: 0-255.
int bcon (OPCIONAL): valor de la componente azul del color con el que se pintará el contorno de la elipse. Valores: 0-255.
int alphacon (OPCIONAL): opacidad del contorno de la elipse a dibujar. Valores: 0 (transparente) – 255 (opaco).
- Clase TAC
A continuación se presenta la clase TAC con sus diversas funciones:
ATRIBUTOS
String tokenName: Token al que pertenece el tac. Si el token es un sensor, <tokenName> es el nombre del sensor (tabletop, kinect…). Si el token es un objeto con áreas asociadas, <tokenName> = idG_Objeto + “_” + idS_Objeto
String consName: Nombre del constraint
String manipulación: Valores posibles= [“add”, “move”, “rotate”, “distance”, “orient”]
String idG: id general del subtoken
String idS: id de sesión del subtoken
String idSToken: id de sesión del Token. Si el Token es un sensor y no un objeto, su valor es “–”.
ArrayList<Float> valores: mínimo 1 valor, máximo 2
MÉTODOS
String getTokenName() // devuelve el nombre del token
String getManipulacion() // devuelve la manipulacion
ArrayList<Float> getValores() //devuelve la lista de valores. Como mínimo la arraylist tiene 1 valor y como máximo 2: Add: 1 valor (0 = remove, 1 = add), Move: 1 o 2 valores (x e y), Rotate: 1 valor, Distance: 1 valor, Orient: 1 valor
String getConstraintName() // devuelve el nombre del constraint
String getSubtokenName() // devuelve el ID general
String getSubtokenIDS() // devuelve el ID de sesión
String getIDSToken() // devuelve el ID de sesión del Token
void info() // escribe por pantalla la información del TAC