Tarea 6. Movimiento de un puntero.

Oliver Fernando Cuate González

ocuate@computacion.cs.cinvestav.mx

10 de Diciembre de 2013


Problema


Marco Teórico

Detección de Colisiones:

Busca determinar si los objetos dentro del Mundo Virtual están en contacto entre ellos. Debido a la diversidad de formas entre los objetos que pueden dibuarse, se utilizan algunas técnicas que buscan simplificar este problema y optimizar los cálculos empleados para determinar si existe colisión entre dos objetos.

Estas técnicas se basan en la idea de envolver los objetos dentro de volúmenes para los que sea fácil calcular las colisiones, si hay colisión entre estos volumenes entonces se puede ir detallando gradualmente el nivel de las colisiones, en caso contrario no es necesario hacer ningún cálculo más.

Dispositivo Patriot:

Este dispositivo cuenta con seis grados de libertad, es decir, proporciona información sobre su posición bajo seis parámmetros significativos distintos.

El dispositivo cuenta con una pequeña base cuadrada. En esta base se encuentra el origen de su sistema coordenado, es decir, la información que arroja el dispositivo es en base a la ubicación de esta base y la configuración que se le inidique.

También cuenta con una pequeña pluma con un botón. La posición de la pluma respecto a la base cuadrada y su inclinación son los datos que nos arroja el dispositivo: su posición en x,y,z, así como los ángulos de Euler y los cosenos directores que indican la inclinación de de la pluma con cada eje. El botón tiene los estados encendido y apagado (1 y 0).

Según el manual, se puede especificar el formato de salida de los datos, así como las unidades deseadas. Se trabajará con el parámetro "P" que devuelve los datos en formato simple.

Ángulos de Euler

Los ángulos de Euler constituyen un conjunto de tres coordenadas angulares que sirven para especificar la orientación de un sistema de referencia de ejes ortogonales, normalmente móvil, respecto a otro sistema de referencia de ejes ortogonales normalmente fijos.

Los ángulos de Euler: Acimut, Elevación y Rotación Propia, son designados por ψ, θ y Φ, respectivamengte, representan una secuencia de rotaciones que definen la orientación del sensor con respecto al su marco de orientación cero; ésta secuencia es: primero una rotación acimut seguida de una rotación de elevación concluyendo con una rotación propia.


Análisis

En la Tarea 5 se detallaron las propiedades deseadas por un volumen envolvente para el uso de las colisiones y se especificaron algunas de ellas. Para mantener el puntero dentro del espacio de trabajo se utilizó una esfera.

Se debe implementar una primitiva Cono, que contenga sus normales en cada vértice para utilizar la iluminación de OpenGl.

Luego de realizar algunas pruebas con el dispositivo Patriot, se decidió que el origen del sistema de coordenadas del dispositivo fuera relativo a la posición en que se da clik por primera vez al botón y orientado según los ejes de la caja del dispositivo. El orden de los ejes coordenados se cambió ya que el dispositivo retorna los valores de x,y,z; que equivaldrían dentro del mundo virtual a x,-z,y, respectivamente, el negativo en z obecede al orden del producto cruz. La orientación del cubo del dispositivo debe orientarse correctammente para obtener los movimientos deseados, en caso que la orienntación sea incorrecta, el cono se moverá de forma distinta.

El cono puede rotar en todas direcciones, por lo que delimitarlo por una esfera que lo cubra completamente es una buena idea para poder mantenerlo dentro del mundo.

Para controlar los movimientos del Cono se usará el dispositivo Patriot, rotándolo y moviéndolo según el dispositivo. Cada vez que el cono se mueva, se verificarán las colisiones, en caso que no exista colisión alguna, el cono será dibujado en la nueva posición. En caso de haber colisión el cono permanecerá en su posición actual y será pintado de color rojo.

Para rotar el cono según el Patriot se realizará primero la Rotación Propia sobre el eje del Ccono (eje y), posteriormente se hará la rotación Elevación, ya sea sobre el eje x o el eje z, y finalemente la rotación Acimut nuevamente sobre el eje z. Esto hará que el Cono se mueva según la posición y dirección del dispositivo Patriot.


Alternativa de Solución en Qt y OpenGL

Las primitiva empleada para la construcción del cono se muestra a continuación.

    int i,m1,m2;
    float alfa;
    float s, c, ang;
    XYZ v1,v2,norm;

    alfa = 2.0*3.141592654/n;

    for ( i=0 to n	) {
        ang = alfa*i;
        s = sin( ang );
        c = cos( ang );

        v[2*i][0] = 0;
        v[2*i][1] = l/2;
        v[2*i][2] = 0;

        v[2*i+1][0] = r*c;
        v[2*i+1][1] = -l/2;
        v[2*i+1][2] = r*s;
    }

    for(i=0 to n){
        m1 = (2*i+1)%(2*n);
        m2 = (2*i+3)%(2*n);
        v1.x = v[m1][0];
        v1.y = v[m1][1]+l;
        v1.z = v[m1][2];

        v2.x = v[m2][0];
        v2.y = v[m2][1]+l;
        v2.z = v[m2][2];

        CROSSPROD(v1,v2,&norm);
        Normalize(&norm);

        normal[i][0] = norm.x;
        normal[i][1] = norm.y;
        normal[i][2] = norm.z;
    }
	

El cono está inicialmente centrado en el origen. Para el manejo del dispositivo Patriot se usó como base la clase PiTracker.cpp que proporciona varios métodos predeterminados para trabajar con el dispositivo Patriot con una conexión USB. Se creó un objeto ptracker de este tipo para establecer la conexión mediante el comando:

ptracker->UsbConnect( 0x0f44, 0xef12, 0x02, 0x82 );

Una vez establecida la conexión se debe configurar el disporitivo en aspecto como lo son las unidades, el formato de lecture y fijar los puntos de referencia de acuerdo a nuestro mundo virtual. Esto se logra mediante los siguientes comandos:

	/* unidades */
	ptracker->WriteTrkData((void*) "u1\r", 3 );
	/* modo binario */
	ptracker->WriteTrkData((void *) "f1\r", 3 );
	/* fomato de entrada */
	ptracker->WriteTrkData((void *) "o1,2,4,6,10\r", 12 );
	ptracker->WriteTrkData((void *)"\x12\x31\r",3);

	memset(command,0,100);
	ptracker->WriteTrkData((void *)"r1\r",3);
	sprintf(command,"a1,%g,%g,%g,%g,%g,%g,%g,%g,%g\r", 0.0,0.0,0.0,   20.0,0.0,0.0,   0.0,20.0,0.0  );
	ptracker->WriteTrkData( (void *)command, strlen(command) );
		

Una vez que se tiene la conexión se crea un método Patriot() en el que se recuperan los del dispositivo datos mediante los comandos:

ptracker->WriteTrkData( (void *)"p", 1); En donde se especifíca el formato de salida "p".

ptracker->ReadTrkData( (void*)buf, 100); Que retorna los valores y los almacena en un buffer buf defindo previamente.

Se utilzarán los datos de la posición x,y,z; los ángulos de Euler y el estado del botón (click). El uso de estos datos se especificará más adelante.

Una vez realzada la conexión con el Patriot el Cono puede rotar libremente según la dirección de la pluma del Patriot, cuando se aprieta el botón, la posición tomada es relativa a la posición en la que se presionó por primera vez. El fragmento de código que hace lo anterior se muestra a continuación:

    char buf[100];
    ptracker->WriteTrkData((void *)"p",1);
    ptracker->ReadTrkData((void*)buf,100);
    pData=(float *)(buf + 8);
    pFlag = (int*)(buf + 68);
    int clAnt = click;

    click = pFlag[0];

    ang_x = pData[4];
    ang_y = pData[5];
    ang_z = pData[3];

    if( clAnt==0 && click==1){
        control = true;
        referencia.x = pData[0];
        referencia.y = -pData[2];
        referencia.z = pData[1];
    }

    if(control){
        posPat[0] = pData[0]-referencia.x;
        posPat[1] = -pData[2]-referencia.y;
        posPat[2] = pData[1]-referencia.z;

        esf_cono.centro.x = posPat[0];
        esf_cono.centro.y = posPat[1] + 10;
        esf_cono.centro.z = posPat[2];
    }
		

Ahora se verifican las colisiones y si no hay ninguna el cono se mueve según los movimientos del Patriot.

Los controles referidos al manejo del cono, la iluminación y la posición de la cámara se mantienen igual que en la tarea anterior.

Estos son los detalles a grandes rasgos de la implementación. Por último se agregan un par de imágenes con diferente perspectiva y el link de descarga del código fuente del programa:

vista1 vista2

vista3 vista3

Descargar Archivo


Bibliografía

Mecate Zambrano Miriam. Interacción con Objetos Deformables. Tesis de maestría, CINVESTAV Departamento de Computación, México, D.F., Noviembre 2008.

Alken, Inc. d/b/a Polhemus. PATRIOT USER MANUAL., Colchester, Vermont, U.S.A., Junio 2012.