miércoles, noviembre 16, 2005

Trimesh y ODE

0) Descomprimir el paquete de ODE que trae los fuentes. Todas lareferencias de directorios asumen que estás en lña raiz de ese árbol.
1) ODE viene para VC6, asi que si usas Dev Cpp debes importar el proyecto que se encuentra en el directorio vc6 y recompilar. 2) Si va a usar trimesh debes decidir si vas a soportar con double o single precision. 3) Para que el proyecto soporte trimesh debes ejecutar vc6/configure-xxx-trimesh.bat donde xxx es single o double.
Este paso simplemente ejecuta este comando :
copy _configs\config-xxx-trimesh.h ..\include\ode\config.h.
Ahora sólo debes hacer un rebuild y tu proyecto generara el dll y .a con el soporte deseado. 4) Codificar tus objetos para que usen trimesh: (el ejemplo lo pego despues) 5) Crear un space e insertar los objetos dentro. Existen varios tipos, para terrenos esta el quadtreespace, para cosas sectorizadas me imagino que seria bueno crear una jerarquia de simpleSpaces insertados dentro de otros como el hashSpace como se explica en la página 58, en la seccion 10.6 Space functions del manual de ODE 6) Detectar colisiones con la callback clásica: static void nearCallback (void *data, dGeomID o1, dGeomID o2) { int i,n; if (!(g1 ^ g2)) return; // si son el mismo retorna const int N = 10; dContact contact[N]; n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); if (n > 0) { for (i=0; i { contact[i].surface.mode = dContactSlip1 dContactSlip2 dContactSoftERP dContactSoftCFM dContactApprox1; contact[i].surface.mu = dInfinity; contact[i].surface.slip1 = 0.1; contact[i].surface.slip2 = 0.1; contact[i].surface.soft_erp = 0.5; contact[i].surface.soft_cfm = 0.3; dJointID c = dJointCreateContact (world,contactgroup,&contact[i]); dJointAttach (c, dGeomGetBody(contact[i].geom.g1), dGeomGetBody(contact[i].geom.g2)); } } } llamando esta rutina con el space root como primer parámetro , alguna data para la rutina de deteccion de colisiones como segundo, (yo le paso mi objeto mundo (world) que encapsula el terreno, la camara , el player, etc, para no usar variables globales) y la dirección de la callback para que la llame cada vez que ODE crea que puede existir una colisión. dSpaceCollide (space,NULL,&nearCallback);
y luego avanzar la simulación con algún dt fijo o calculado.
dWorldStep (world,0.05);
y despues limpiar la lista de contactos en cada ciclo:
dJointGroupEmpty (contactgroup);
Ojo que este contacgroup debe ser creado al principio de la simulación.
En el directorio ode/test estan los códigos fuentes de todos los ejemplos, y el loop de simulación es similar en todos, varia un poco la rutina de deteccion de colision en el sentido de que algunos sólo colisionan objetos contra el suelo, otras evitan colisionar objetos conectados por un Joint, etc.

No hay comentarios.: