Interacción con el mundo virtual
Interacción con el mundo virtual
En este apartado se va a ver como se puede realizar la interacción con el mundo virtual a través de una marca de ARToolkit. Así pues, partiremos de un ejemplo en el que tenemos una marca de ARToolkit ya en pantalla, e introducimos otra marca. Para hacer que dichas marcas interactuen será necesario determinar la posición de cada una y ver sus posiciones relativas.
Hasta el momento no nos hemos preocupado por la posición de la marca, porque ARToolkit automáticamente calculaba la matriz de transformación de la cámara respecto a la marca, y esta transformación se entregaba a OpenGL, que permitia dibujar el cubo sobre la marca sin necesidad de saber que estaba haciendo realmente. Pues ahora ha llegado el momento de tener que saberlo. Si se recuerda el ejemplo exview comentado en la unidad anterior, al ejecutarlo mostraba la posición de la cámara respecto a la marca.
Si se observa el código de dicho ejemplo (examples/exview/exview.c) se podrá observar que la instrucción encargada de mostrar este texto es (línea 145):
sprintf(string," RAW: Cam Pos x: %3.1f y: %3.1f z: %3.1f", cam_trans[0][3], cam_trans[1][3], cam_trans[2][3]);
Aquí, como se puede observar, se está accediendo a las posiciones 0 a 2 de la columna 3 (recuérdese que en C los índices empiezan en 0) de la matriz de transformación de la cámara. Realmente, la matriz de transformación, ya sea de la cámara o la que se obtiene de la marca (patt_trans en el caso del ejemplo simpleTest) es una matriz de 3x4 con la siguiente estructura:
Como se puede observar, las primeras 3 filas de las primeras 3 columnas se corresponden con las rotaciones a aplicar al elemento en cuestion, mientras que las primeras tres filas de la cuarta columna se corresponden con la traslación en cada uno de los ejes X, Y y Z respectivamente. Así pues, para conocer la posición de una marca, tan solo hay que acceder a esos elementos de la matriz de transformación. Así pues, una vez conocemos las posiciones de las marcas, podemos establecer relaciones entre ellas e interactuar con el mundo virtual.
Práctica: Obteniendo la posición de una marca
Práctica: Interactuando con el mundo virtual
En esta práctica se pide al alumno que modifique el código del ejemplo simpleTest (examples/simpleTest) de forma que se detecten dos marcas distintas, de forma que cada marca tenga un cubo de un color sobre ella, y cuando se acerquen los dos cubos, éstos cambien y se pongan los dos del mismo color (ver figura).
Las marcas a usar pueden ser las que desee el alumno, ya sea algunas que traiga ARToolkit o algunas hechas por el alumno. En la resolución se usarán las marcas Hiro (patrón para imprimir patterns/pattHiro.pdf y marca para ARToolkit bin/Data/patt.hiro) y C (patrón para imprimir patterns/pattMulti.pdf y marca para ARToolkit bin/Data/multi/patt.c).
Para establecer cuando se considera que ambas marcas están cerca, se puede usar el eje X, el Y, el Z o todos, a gusto del alumno, lo importante es conseguir que haya interacción entre los objetos virtuales.