Realidad Virtual y Animación

Anuncio
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
Descargar