PAC2 Realitat Virtual (Joan Soler)

Page 1

Grau de Multimèdia

REALITAT VIRTUAL PAC2 (Desembre 2012) Alumne: JOAN SOLER ABELLÓ

ENUNCIAT Aquesta PAC parteix del guió d'interacció de l'aplicació de Realitat Virtual (RV) de tipus Realitat Mixta presentat a la Pràctica 1 i es planteja com una memòria de treball de la Pràctica 2. Consta de les parts següents: 1. DOCUMENTACIÓ: cal explicar el procés de treball seguit a la Pràctica 2 des de les primeres proves fins a la versió final. Això inclou fotos i/o captures de pantalla a més de fragments de codi comentats (en el cas d'haver lliurat un prototip) o bé esbossos i/o versions desestimades a més de dissenys intermedis i/o de prova (en el cas d'haver lliurat una maqueta). 2. DIFICULTATS: comentar quines han estat les principals dificultats i/o reptes a superar durant la realització de la Pràctica 2. En el cas d'haver lliurat un prototip caldrà centrar-se en les dificultats tècniques, i en el cas d'haver lliurat una maqueta en les dificultats de disseny d'interfície i en els aspectes d'usabilitat. 3. MILLORES: tenint en compte la finalitat i context d'ús al que anava destinada l'aplicació de la Pràctica 2, indicar quines millores o canvis es podrien introduir en futures versions que resultessin coherents amb el plantejament seguit fins ara. 4. IMPACTE: reflexionar sobre l'impacte que aquesta aplicació podria tenir en el camp o en el context d'ús al que està destinada. Seria convenient considerar quines altres aplicacions similars estan ja en funcionament.

5. HACKS: imaginar usos no previstos en el plantejament inicial de l'aplicació que en canviessin la finalitat o el sentit pel simple fet d'apartar-se de l'ús convencional o desitjable (un exemple: usar una eina com una joguina)

PAC2-Realitat Virtual

1 / 14


RESOLUCIÓN PAC2 DOCUMENTACIÓ: El proceso llevado a cabo tras la definición de la aplicación en la Práctica 1 hasta llegar a disponer de un prototipo cómo como el que puede verse en funcionamiento en http://youtu.be/ddxl0-dbBfo se ha pasado por una evolución que particularmente queda reflejada en las distintas versiones del programa (y pruebas) desarrolladas en Processing:

Debía crear un display de 640x480 px representando una balanza que “pesara” tanto piezas reales como virtuales.

PAC2-Realitat Virtual

2 / 14


Paso a analizar las versiones que han significado un cambio importante en el desarrollo. En las dos figuras siguientes puede verse gráficamente lo que mostraba el display en cada una de ellas:

Versión 1 y 3: En las primeras versiones del programa de la aplicación se crearon tanto las piezas móviles (que girarían un ángulo dependiendo del “desequilibrio”) y las fijas correspondientes a la balanza virtual. Se ajustan los setups iniciales. Además de programa la lectura de la webcam

Versión 4: En esta versión se ha modificado el programa de forma que la captura de video de la webcam se convierte, frame a frame, en una imagen en blanco y negro donde se define el nivel (treshold) en que un pixel leído será blanco o negro. Puede verse en la imagen presentada más arriba que el fondo de la imagen convertida pasa a ser blanco.

En este punto, se crean algunas piezas “reales” que tras recortarlas podrán usarse para colocarlas en el plano real conjuntamente con otras piezas físicas.

PAC2-Realitat Virtual

3 / 14


Versión 6: Se muestra esta versión ya que daba un problema de programación que hubo que resolver ya que un error en la programación del cálculo del ángulo de giro hacía que la balanza girara y girara sin detenerse.

Versión 8: Esta versión podría decirse que en la primera versión final aunque sólo disponía de la balanza virtual y del proceso de reconocimiento de piezas reales así como del cálculo de los píxeles negros presenten en el sector de “pesaje” de cada uno de los paltos.

Versión 16: Se han añadido textos fijos y el texto que muestra el desequilibrio mostrando el valor de la variable correspondiente al ángulo calculado.

Y ya las versiones finales:

PAC2-Realitat Virtual

4 / 14


Versión 22: En esta versión del programa del prototipo de la aplicación se han añadido las piezas virtuales. Y para la función de coger, arrastrar y dejar con el ratón de hace uso de las funciones “dragging” definidas en los ficheros correspondientes. Una vez la pieza virtual ha sido colocada en el sector correspondiente a un plato y dado que se conoce el número de pixeles que la componen, ésta entra en el cómputo del cálculo del ángulo de giro.

Versión 26: Se trata de la versión final que en comparación a la anterior dispone de una mejor definición del color a computar y del área del sector de cada plato, evitando al máximo el ruido (sombras y reflejos) que afectaban al cálculo.

Con respecto a los comentarios del código del programa en Processing me remito al siguiente fichero (ya entregado en la Práctica 2) correspondiente al prototipo totalmente operativo y donde el código está completamente comentado.

(la inserción de este fichero es la principal razón para no entregar la PAC en .pdf sino en .doc)

Con respecto al montaje, en las siguientes fotos puede verse una visión general y detalles, así como a mí operando el prototipo:

PAC2-Realitat Virtual

5 / 14


PAC2-Realitat Virtual

6 / 14


DIFICULTATS: Paso a enumerar y comentar algunas de las dificultades principales encontradas durante la elaboración del prototipo: -

Utilización de versión de Processing que operara correctamente. Tras varias pruebas con distintas versiones de Processing (v1.5.1, v2.0b6_64 bits y v2.0b6_32 bits) la versión que finalmente a funcionado sin problemas ha sido la v2.0b6_32 bits

-

Cuando se abordó el giro de todas las piezas “móviles” según el ángulo que mostraba el desequilibrio surgieron dos problemáticas :  Agrupar todos los elementos móviles formando un grupo y que giraran a la vez usando el mismo punto de referencia La agrupación se llevó a cabo con PShape (http://processing.org/learning/pshape/) creando un grupo (que llamamos “móvil”) compuesto por todas las formas simples que forman las partes móviles (los platos, el fiel, el brazo, etc). //Declaramos el conjunto de figuras que girará con el peso PShape movil, plat_izq, plat_der, fiel, base_izq, base_der, brazo;

//Creamos el “padre” que llamamos movil movil=createShape(GROUP)

//Creamos cada una de las partes smooth(); plat_izq= createShape(RECT,-270,-220,200,200); plat_der= createShape(RECT,70,-220,200,200); fiel= createShape (TRIANGLE,-10,0,10,0,0,-90); base_izq = createShape (RECT,-190,-20, 50,15); base_der = createShape (RECT,140,-20, 50,15); brazo = createShape (RECT,-190,-5,380,10);

//Añadimos los "hijos" al padre" movil.addChild(plat_izq); movil.addChild(plat_der); movil.addChild(fiel); movil.addChild(base_izq); movil.addChild(base_der); movil.addChild(brazo); shape (movil);

 Tener en cuenta que un desplazamiento o giro, lo que movemos la rejillla (o coordenadas del gráfico) y no el propio objeto. Ello queda muy bien explicado en http://processing.org/learning/transform2d/ . Por lo tanto, creamos cada una de las formas (en el apartado anterior) tomando como referencia el origen de coordenadas para posteriormente hacer la traslación de la rejilla.

PAC2-Realitat Virtual

7 / 14


En el código de Processing //desplazamos el centro de coordenadas pushMatrix(); translate(width/2,350); …………………… // y después lo volvemos al origen popMatrix();

Antes de devolverlo al origen deberíamos aplicar el ángulo de giro en radianes. (El código que se ha incluido en esta descripción está extraído del código de programa del prototipo perteneciente a la función “dibujarMovil() “)

-

Leer las piezas reales. Se ha hecho pasando la imagen obtenida con la webcam a blanco y negro definiendo un umbral (threshold). //filtramos la imagen a blanco y negro para que identifique //las piezas lo mejor posible filter(THRESHOLD,0.5);

Por lo tanto disponíamos de una imagen formada por pixeles blancos o negros. A partir de aquí aparecen algunas problemáticas a solucionar:  Disponer de iluminación suficiente y fondo blanco para eliminar al máximo ruidos y sombras. Es un problema que se intentó solucionar incrementando el número de lámparas (caseras) que iluminaban la escena y el uso de una cartulina blanca.  Establecer bucle de lectura de pixeles usando la función get a la vez que se define un área para cada plato de la balanza para que el pixel negro leído compute en uno o en otro. Por ejemplo para el plato izquierdo for (int i = 20; i < width/2-50; i++) { for (int j = 50; j < 350; j++) { iquincolor=get(i,j); if (iquincolor == color(0)) { //si el color es negro pesoizq++ ; //aumenta una unidad } }

-

Leer las piezas virtuales. Las piezas virtuales, son de área conocida ya que la declaramos al iniciar el programa. Tan sólo hay que computarla en un plato u otro dependiendo de su posición. Para las cuatro piezas definidas miramos su coordenadas de posición y dependiendo de ellas computará en uno de los platos o en ninguno: // ahora calculamos si hay alguna pieza virtual colocada en alguno de los platos // si es así debe `pesar if (r1.x<width/2 && r1.y<350) { //si la pieza r1 está situada en el cuadrante superior izquierdo pesoVizq=pesor1 ; } if (r2.x<width/2 && r2.y<350) { //si la pieza r2 está situada en el cuadrante superior izquierdo

PAC2-Realitat Virtual

8 / 14


pesoVizq=pesoVizq+pesor2 ; } if (c1.x<width/2 && c1.y<350) { //si la pieza c1 está situada en el cuadrante superior izquierdo pesoVizq=pesoVizq+pesoc1 ; } if (c2.x<width/2 && c2.y<350) { //si la pieza c2 está situada en el cuadrante superior izquierdo pesoVizq=pesoVizq+pesoc2 ; }

if (r1.x>width/2 && r1.y<350) { //si la pieza r1 está situada en el cuadrante superior derecho pesoVder=pesor1 ; } if (r2.x>width/2 && r2.y<350) { //si la pieza r2 está situada en el cuadrante superior derecho pesoVder=pesoVder+ pesor2 ; } if (c1.x>width/2 && c1.y<350) { //si la pieza c1 está situada en el cuadrante superior derecho pesoVder=pesoVder+ pesoc1 ; } if (c2.x>width/2 && c2.y<350) { //si la pieza c2 está situada en el cuadrante superior derecho pesoVder=pesoVder+ pesoc2 ; }

-

Selección y arrastre de las piezas virtuales. Creamos una clase Draggable para los rectángulos y otra clase para las elipses o círculos. Dicha clase Draggable está constituida por acciones definidas como display, clicked, rollover, stopDragging y drag, que se controlamos con las variables booleanas dragging y rollover. Y las usamos en el código del prototipo aplicadas a las piezas virtruales: //declaramos las variables de las piezas virtuales Draggable r1; Draggable r2; Draggablec c1; Draggablec c2;

void piezasVirt () { r1.rollover(mouseX,mouseY); r1.drag(mouseX,mouseY); r1.display(); r2.rollover(mouseX,mouseY); r2.drag(mouseX,mouseY); r2.display();

c1.rollover(mouseX,mouseY); c1.drag(mouseX,mouseY); c1.display(); c2.rollover(mouseX,mouseY);

PAC2-Realitat Virtual

9 / 14


c2.drag(mouseX,mouseY); c2.display(); }

//Y añadimos las funciones de mouse void mousePressed() { r1.clicked(mouseX,mouseY); r2.clicked(mouseX,mouseY); c1.clicked(mouseX,mouseY); c2.clicked(mouseX,mouseY); }

void mouseReleased() { r1.stopDragging(); r2.stopDragging(); c1.stopDragging(); c2.stopDragging(); }

-

Cálculo del ángulo de giro. Tras varias pruebas vemos que el máximo que cabe en un plato son 40000 pixeles y que el máximo ángulo de giro que mantiene los platos dentro de la escena es de 15º, por lo tanto la fórmula que aplicamos es: angulo= ((pesoder+pesoVder)-(pesoizq+pesoVizq))*15/40000;

O sea, el ángulo es calculado por diferencia de números de pixeles contabilizados en las áreas de cada plato y aplicándole el factor de que gire 15º cuando la diferencia sea de 40000 pixeles. El ángulo de rotación se pasa a radianes para la rotación: angle = radians(angulo); rotate(angle);

-

También cabe señalar dos puntos que no funcionan en el prototipo pero que han sido útiles:  Diversas impresiones de control para ir verificando los valores de salida: //Prints de control println( "Lado izquierdo= " + pesoizq); println( "Lado derecho= " + pesoder); println( "Angulo= " + angulo); // println( "r1= " + r1.x + ", " + r1.y); // println( "r2= " + r2.x + ", " + r2.y); // println( "c1= " + c1.x + ", " + c1.y); // println( "c2= " + c2.x + ", " + c2.y); //println(pesor1); // println(pesor2); //println(pesoc1); // println(pesoc2); // println (pesoVder); //println (colorqui);

PAC2-Realitat Virtual

10 / 14


 Función para grabar imágenes. Usada para recoger frame a frame las imágenes captadas por la webcam y tratadas, para posteriormente editadas para crear el video presentada en la Práctica 2: // Añadimos la orden para guardar las imagenes saveFrame("demo_02_virt_bal_#####.png");

Obtenemos una colección de archivos correlativos tipo .png :

PAC2-Realitat Virtual

11 / 14


MILLORES: En base a algunas de las dificultades que se han mencionado en el apartado anterior, aparecen los primeros puntos de mejora: -

Mejora de la iluminación para evitar sombras y perfilados. Uso de lámparas indirectas y de color blanco para homogeneizar la luz de la escena.

-

Uso de una base sólida de color blanco evitando que se produzcan dobleces que puedan ser leídos por la cámara como pixeles negros cuando se trata de “ruido”

-

El uso de luz indirecta podría evitar los brillos que provocan algunas piezas mecánicas o papel satinado mejorando la lectura y su exactitud.

Una posible solución a los tres problemas anteriores sería el uso de una fuente de luz (no puntual) difuminada a través de cristal translucido blanco que haga de base dónde colocar las piezas para su lectura. O sea algo similar a lo que se usa para ver radiografías. Otras mejoras en futuras versiones podrían ser: o Evitar convertir a blanco y negro (binarización). Se podría considerar la posibilidad que cada gama de color tuviera un “peso” distinto. o Reconocimiento del jugador mediante la webcam. Si no es posible mediante reconocimiento facial debido a su dificultad, podría identificarse por una forma geométrica definida por éste como su “logo identificador” o Lógicamente una mejora espectacular será trabajar en 3D. De esta forma, el “peso” no dependería de cómo se posiciona la pieza con respecto al plano base donde las colocamos. Posible evoluciones: -

Manteniendo el concepto de medida de “área” podría evolucionar hacia distintas posibilidades: o Comparación de áreas de siluetas en el campo de control de calidad tales como calibración, clasificación, rechazos por rebabas en piezas, etc o Reconocimiento de recortables. Por ejemplo, imaginemos dos jugadores y la máquina pide “vaca pequeña azul”. Cada jugador pone en su “platillo” el recortable que propone y la balanza, puntuando por cada acierto de lo solicitado inclina la balanza hacia el ganador.

-

Lectura y reconocimiento de imágenes reales o Pongamos por ejemplo que se reconocen monedas. La aplicación indica un coste y un pago. El jugador debe colocar en el otro platillo el cambio a ese pago hasta que el platillo se equilibra. o Podemos hacer lo mismo que en el apartado anterior pero con monedas extranjeras o Una variante sería que la aplicación propone una cantidad en una moneda y el jugador puede colocar en el otro platillo la misma cantidad pero en otra moneda distinta. (En los casos anteriores la aplicación podría destinarse a entrenamiento para dar cambio o a entrenamiento para el uso de moneda extranjera. Aunque cualquiera de los tres casos podría aplicarse en el ámbito comercial como ayuda a vendedores).

PAC2-Realitat Virtual

12 / 14


IMPACTE:

El impacto de la aplicación en el contexto educativo sería el desarrollo y mejora de la capacidad de reconocimiento y evaluación de áreas, en diversas formas geométricas, de los alumnos. Con ello se potenciaría el reconocimiento y comparación de formas no tan sólo lineales inherente en la mente humana, enriqueciendo su capacidad comprensiva. Un impacto similar tendría lugar cuando la aplicación se use en un entorno no tanto educativo sino meramente de ocio. Además dado el grado de libertad de que dispone la aplicación al poder usar elementos reales, formas recortadas, etc hay que añadir una mejora del conocimiento de elementos que nos rodean que podrán entenderse de una forma distinta a las que estamos acostumbrados, dando así al alumno/jugador un plus de capacidad de imaginación o de búsqueda y análisis visual de elementos reales que puede usar como propuesta para equilibrar la balanza. En evoluciones posteriores dónde se aplique el 3D el impacto de mejora cognitiva en la evaluación de los elementos reales puede ser sustancial.

Tal como comenté en la Práctica 1 el propósito era lograr una buena interacción entre la parte real y la virtual y los dos ejemplos que me sirvieron de referencia fueron: -

Piplex (http://plex.plasticinteraction.com/?p=1)

-

Room Racers (http://www.youtube.com/watch?v=oxjGRL7ZiLE)

Por lo tanto algún punto de similitud espero que haya transcendido a mi prototipo.

Para buscar qué otras aplicaciones similares se pueden encontrar lo que se ha hecho ha sido buscar en Google entradas como: -

“balanza virtual”

-

juego balanza

-

balanza realidad virtual

Con ello lo más destacado que se ha encontrado son juegos, simulaciones o demos dentro del entorno virtual pero no una aplicación de realidad virtual, aumentada o mixta: http://www.educaplus.org/play-42-Equilibra-la-balanza-N%C3%BAmeros-positivos.html http://micibercole.blogspot.com.es/2010/03/balanza-virtual.html http://www.educaplus.org/play-104-Balanza-monoplato.html http://www.matematicasdivertidas.com/Zonaflash/juegosflash/juego-balanza.swf http://www.superjocs.com/super-juegos/juego/super-balanza/ etc

PAC2-Realitat Virtual

13 / 14


HACKS:

En el apartado de usos no previstos podrían listarse: -

Su uso fuera de un entorno educativo, demostración o de ocio puede considerarse un mal uso.

-

En relación con el punto anterior, si alguna persona pudiera pensar que el desequilibrio que se mide va ligada realmente al peso, hay que aclarar que no es así. La idea es que queda relacionado con el área proyectada sobre una superficie (al fin y al cabo número de pixeles) y no depende en absoluto ni del tipo de material, ni de su peso específico, ..).

-

Otro uso indebido sería el relacionado con cualquier intento de medición exacta y su relación con alguna actividad económica, apuestas, …

-

Dado el uso de un ordenador y de una iluminación intensa hay que evitar que principalmente personas jóvenes o menores de edad inviertan largos periodos de tiempo usando la aplicación. Se debe abandonar el juego a los primeros síntomas de cansancio.

-

En el caso de aplicar la solución de un cristal translúcido como base donde colocamos las piezas, se deberán evitar golpes, uso de elementos con aristas que puedan rayar el cristal, etc

-

En el caso de usar la superficie blanca similar a la cartulina habrá que tener especial cuidado en no ensuciar dicha superficie para evitar lecturas falsas. En el caso de un uso masivo (como podría suceder en una demo) este punto puede llegar a ser crítico.

-

Dado que durante el juego se pueden cortar piezas, hay que tomar precauciones referidas al uso de tijera o elementos cortantes, en especial en el caso de niños.

-

============================================

PAC2-Realitat Virtual

14 / 14


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.