En este ejemplo de programa HOST se divide en area de juego en 7 áreas dintintas, y se informa de en qué area está el Tag 089 en cada momento
Fichero displays.xml
<xml> <virtualDisplay width="1280" height="768"> <display id="1" x="0" y="0" width="1280" height="768" /> </virtualDisplay> </xml>
Fichero TUIML.xml <juguemos> <token name="ubisense"> <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="089"/> </constraint> <constraint name="paredCentro" type= "2D" list_vertex="0.44583333,0.21728395,0.6611111,0.21975309,0.65833336,0.36296296,0.44583333,0.36296296,0.44305557,0.21975309" > <tac subtoken="089"/> </constraint> <constraint name="paredIzq" list_vertex="0.41805556,0.21481481,0.4138889,0.36296296,0.19583334,0.36049384,0.20833333,0.21234567,0.41527778,0.21481481" > <tac subtoken="089"/> </constraint> <constraint name="paredDer" list_vertex="0.69027776,0.21728395,0.90416664,0.22469136,0.9027778,0.3580247,0.6888889,0.36049384,0.6861111,0.21481481" > <tac subtoken="089"/> </constraint> <constraint name="mesa1" list_vertex="0.20972222,0.5777778,0.325,0.58271605,0.31805557,0.7604938,0.19861111,0.745679,0.20694445,0.5802469" > <tac subtoken="089"/> </constraint> <constraint name="mesa2" list_vertex="0.37361112,0.5876543,0.48472223,0.5876543,0.47916666,0.76296294,0.36666667,0.7654321,0.37083334,0.5925926" > <tac subtoken="089"/> </constraint> <constraint name="mesa3" list_vertex="0.5152778,0.58518517,0.63472223,0.5925926,0.63055557,0.75061727,0.51111114,0.7654321,0.5152778,0.58518517" > <tac subtoken="089"/> </constraint> <constraint name="mesa4" list_vertex="0.68472224,0.5802469,0.81805557,0.58518517,0.81527776,0.74814814,0.68194443,0.7580247,0.68472224,0.58271605" > <tac subtoken="089"/> </constraint> <subtoken idG="089"/> </token> </juguemos>
Codigo Host en Proccessing
int ANCHO=1280; //definir valores segun tamaño pantalla destino int ALTO=768; TACAPI miAPI; DisplaysHost displaysClient; //tags de ubisense float tag089_X=0; float tag089_Y=0; int rojo=0; String localizacion="todo"; void setup() { // Keystone will only work with P3D or OPENGL renderers, // since it relies on texture mapping to deform //fullScreen( P3D); size(80, 60, P3D); frameRate(16); //definicion de la API miAPI = new TACAPI(); //virtual screens displaysClient = new DisplaysHost("host"); } void draw() { //Programacion Juego displaysClient.beginDraw(); displaysClient.elipse(tag089_X,tag089_Y, 50,50, rojo, 100,100, 255); displaysClient.escribir("estoy en "+localizacion, ANCHO/2, ALTO/2, 20, 255, 255, 255, 255); displaysClient.endDraw(); } void eventoTAC(TAC ta) { //tratamiento de tacs //ta.info(); if (ta.getTokenName().equals("ubisense") && ta.getManipulacion().equals("move") && ta.getConstraintName().equals("todo") && ta.getSubtokenName().equals("089")) { tag089_X = ta.getValores().get(0)*ANCHO; tag089_Y = ta.getValores().get(1)*ALTO; } if (ta.getTokenName().equals("ubisense") && ta.getManipulacion().equals("add") && ta.getSubtokenName().equals("089")) { if (ta.getConstraintName().equals("paredIzq")) { print("paredIzquierda "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="pared izquierda"; } else { rojo=0; println("salgo"); localizacion="todo"; } } if (ta.getConstraintName().equals("paredCentro")) { print("pared centro "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="pared centro"; } else { rojo=0; println("salgo"); localizacion="todo"; } } if (ta.getConstraintName().equals("paredDerecha")) { print("pared derecha "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="pared derecha"; } else { rojo=0; println("salgo"); localizacion="todo"; } } if (ta.getConstraintName().equals("mesa1")) { print("mesa 1 "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="mesa 1"; } else { rojo=0; println("salgo"); localizacion="todo"; } } if (ta.getConstraintName().equals("mesa2")) { print("mesa 2 "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="mesa 2"; } else { rojo=0; println("salgo"); localizacion="todo"; } } if (ta.getConstraintName().equals("mesa3")) { print("mesa 3 "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="mesa 3"; } else { rojo=0; println("salgo"); localizacion="todo"; } } if (ta.getConstraintName().equals("mesa4")) { print("mesa 4 "); if (ta.getValores().get(0)==1.0) { rojo=255; println("entro"); localizacion="mesa 4"; } else { rojo=0; println("salgo"); localizacion="todo"; } } } } void mensajeRecibido(OscMessage theOscMessage) { //tratamiento mensaje osc } void keyPressed() { switch(key) { case ESC: displaysClient.disconnect(); super.stop(); break; } }
Retos de aprendizaje
- Integrar un segundo tag e informar de su localizacion en áreas
- Modificar las áreas y crear un distribucion en el espacio distinta
- informar de la distancia al centro de un area de cada tag
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).
- escribir
Este método permite escribir texto de tamaño y color solicitados. Los parámetros que recibe este método son los siguientes:
String texto: texto que se desea escribir en pantalla.
float x: posición de la esquina superior izquierda del texto en el eje X (2D).
float y: posición de la esquina superior izquierda del texto en el eje Y (2D).
int tamagno: tamaño del texto que se escribirá en pantalla.
int r: valor de la componente rojo del color con el que se escribirá el texto. Valores: 0-255.
int g: valor de la componente verde del color con el que se escribirá el texto. Valores: 0-255.
int b: valor de la componente azul del color con el que se escribirá el texto. Valores: 0-255.
int alpha: opacidad del texto a escribir. 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: Valor: “add”
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: 1 valor
MÉTODOS
String getTokenName() // devuelve el nombre del token
String getManipulacion() // devuelve la manipulacion
ArrayList<Float> getValores() //devuelve la lista de valores: 1 valor (0 = remove, 1 = add)
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