Realidad Virtual y Animación CURSO 20011-12 Práctica 2- Renderizado háptico de bajo nivel. Práctica 3 1 Renderizado háptico de bajo nivel. Introducción En prácticas anteriores se han implementado aplicaciones RV utilizando librerías de alto nivel. Dichas librerías facilitan el control del dispositivo háptico, estando limitada su funcionalidad. En esta práctica se deberá implementar el bucle de control de un dispositivo háptico, a bajo nivel, en un entorno sencillo. El presente guion describirá las tareas que debe realizar el alumno así como las características del entorno en el que el usuario realizará la práctica. Para la realización de esta práctica el alumno contará con un código básico que deberá modificar para añadir las funcionalidades que se soliciten. Para el rederizado háptico se utilizará la librería CHAI3D (www.chai3d.org). CHAI3D al igual que OpenHaptics permite programar el control del dispositivo tanto a alto como a bajo nivel. Como se ha comendo anteriormente en esta práctica nos centraremos en las posibilidades que nos ofrece CHAI3D para desarrollar el bucle de control del dispositivo háptico. La siguiente tabla compara las dos librerías mostrando sus principales diferencias Open Source Soporte para múltiples dispositivos hápticos Multiplataforma Háptico Virtual Gratis Integrado con librería físicas Visualización CHAI3D Si Si Si Si (ODE) OpenHaptics No Sólo permite utilizar dispositivos Phantom Si No (aunque dispone de una licencia educacional) No No Si No Si Si El renderizado visual se realizará utilizando OpenInventor. 2. Descripción Tal y como se ha explicado en el apartado anterior, cada grupo de prácticas deberá implementar el bucle de control háptico en un entorno virtual sencillo. La práctica constará de dos partes, una parte obligatoria y otra opcional. La parte obligatoria se realizará de forma totalmente guíada tal y como se describe en el punto 3. 2.1 Descripción del entrono virtual 2 de 7 Práctica 3 Renderizado háptico de bajo nivel. Se ha restringido el entorno de trabajo a la escena que se describe a continuación con el objetivo de simplificar el algoritmo de control. La figura que se muestra a continuación describe la escena gráficamente. Como puede apreciarse en la imagen anterior, como proxy se utilizará un esfera de 0.5 unidades de radio. El movimiento de dicho proxy estar restringido a un pasillo en forma de L con el ancho indicado en la figura. Las paredes superiores del pasillo tienen una pendiente de -45º y las inferiores de 45º. 2.2 Descripción del algoritmo de renderizado háptico En el renderizado háptico se utilizará un algoritmo con muchas limitaciones y restringido a la escena antes descrita. Todo en aras de simplificar su implementación. A continuación se detallarán las características del modelo: - - El movimiento del usuario se restringirá al plano Z=0. Si el usuario sale de este plano se aplicara una fuerza proporcional al movimiento en el eje Z para acercarle de nuevo al plano. Cuando el usuario colisione con alguna pared se le aplicar una fuerza en el eje X proporcional a la penetración del proxy en dicho eje. Este modelo proporciona fuerzas no normales al punto de colisión. La detección de colisiones se realizará de forma estática. Dada la simplicidad de la escena no es necesario utilizar un método dinámico. 3 de 7 Práctica 3 - Renderizado háptico de bajo nivel. Se considerará que la esfera colisiona con la pared si su extremo derecho o su extremo izquierdo colisionan con la misma. Este modelo no garantiza que no existan. 2.3 Descripción del material proporcionado Para facilitar el desarrollo de la práctica se proporciona el fichero “bhaptic.cpp”. Dicho fichero contiene parte del código, de forma que cada grupo de prácticas deba extenderlo con las funcionalidades que se le indiquen. “bhaptic.cpp” comienza incluyendo las librerías de renderizado tanto háptico como visusual. A continuación, define las constantes: #define Kv 0.0f #define Kpz 40.0f #define Kc 40.0f Dichas contantes controlan la magnitud de las fuerzas que se aplican al dispositivo: Kc evita los contactos, Kv se aplica a las fuerzas de amortiguamiento, Kpz mantiene el proxy en el plano Z=0. El alumno podrá variar su valor y experimentar como varía la percepción de las fuerzas. Las variables: float x=0.0f; float y=0.0f; definen las posición del proxy. En cada ciclo, el bucle de control háptico modificará su valor. A continuación se definen las callbacks que controlan los eventos del teclado y el renderizado visual: void keyCallBack (void *userData, SoEventCallback *eventoTeclado) void renderCallback (void *userData, SoSensor * sensor) La function initOI inicializa la escena openInventor: void initOI(int argc, char ** argv) Posteriormente se definen el manejador de los distintos dispositivos hápticos (hhandler), el manejador del thread control háptico y el dispositivo háptico (hdevice). Esta última variable se utilizará para conocer la posición del háptico y aplicarle la fuerza correponciente. cHapticDeviceHandler *hhandler; cThread *hapticThread; cGenericHapticDevice* hdevice; 4 de 7 Práctica 3 Renderizado háptico de bajo nivel. Seguidamente se declara la función que define la funcionalidad del thread de control háptico. En esta función, partir de la posición de dispositivo, se calcularán las fuerzas que el dispositivo deberá suministras (amortiguamiento, contacto y retorno al plano Z=0). void updateHaptics(void) Cada paso de simulación se comprobará si la posición del dispositivo, su velocidad y si ha sido pulsado algún botón. cVector3d newPosition; hdevice->getPosition(newPosition); cVector3d linearVelocity; hdevice->getLinearVelocity(linearVelocity); bool buttonStatus; hdevice->getUserSwitch(0, buttonStatus); Por último, se inicializar el entorno haptico, el dispositivo háptico y el thread háptico en: void initChai3D() 3. Implementación obligatorias de las funcionalidades En este apartado se definen las funcionalidades obligatorias que cada grupo de prácticas deberá implementar: Restringir el movimiento al plano Z=0: Se aplicará una fuerza proporcional a la coordenada Z de la posición. Una vez añadido el código que se indica a continuación se ejecutará el código para comprobar que efectivamente cuando la posición del dispositivo se aleja del plano Z=0, aparecen fuerzas en el eje Z que intentan anular esta coordenada. cVector3d force (-Kpz*newPosition[0],0,0); newForce.add(force); hdevice->setForce(newForce); Nota: El eje Z virtual se corresponde con el eje X del dipositivo y los ejes virtuales X e Y con los ejes Y y Z respectivamente. Activar el renderizado visual: Se deberá descomentar la inicialización de la librería openInventor en la función principal (main). Comprobar que la escena se renderiza correctamente. initOI(argc, argv); 5 de 7 Práctica 3 Renderizado háptico de bajo nivel. Conectar el dispositivo háptico con proxy: Para conectar los movimientos del usuario con los movimientos del proxy, en el bucle de control asignaremos a las variables “x” e “y” la posición del dispositivo, multiplicadas por un factor de escala. x=20.0f*newPosition[1]; y=20.0f*newPosition[2]; A continuación, en el callback de renderizado asignaremos el valor de estas 2 variables a la traslación que se aplica al proxy. proxyPos->translation=SbVec3f(x,y,0.0f); Por último, comprobaremos que todo funciona correctamente. Restringir el movimiento del proxy: El código que se muestra a continuación mantiene el proxy dentro del pasillo (ver punto 2.2). Tras añadir dicho código se comprobará que el proxy se mantiene dentro de los límites definidos. if (y<0) { if (x<(y-0.5f)) x=y-0.5f; else if (x>(y+0.5f)) x=y+0.5f; }else{ if (x<-(y+0.5f)) x=-(y+0.5f); else if (x>-(y-0.5f)) x=-(y-0.5f); } Aplicar fuerzas de contacto: A partir de la penetración del proxy se calcularán las fuerzas que debe proporcionar el dispositivo (ver punto 2.2). Identificar los problemas del modelo de fuerzas propuesto. force=cMul(Kc,cVector3d(0.0f,0.05f*x-newPosition[1],0.0f)); newForce.add(force); 4. Partes opcionales El alumno podrá extender la funcionalidad de la práctica como considere oportuno. A modo de ejemplo, a continuación, se enuncian posibles funcionalidades de carácter opcional: 1. Añadir amortiguamiento o viscosidad 2. Añadir masa al proxy (inercia) 3. Añadir la fuerza de la gravedad. 6 de 7 Práctica 3 Renderizado háptico de bajo nivel. 4. Extender el modelo de renderizado háptico de forma que se proporcionen fuerzas normales a la superficie. 5. Mejorar la detección de colisiones de forma que eviten interpenetraciones. 6. Aumentar la complejidad de la escena 7 de 7