lunes, noviembre 21, 2005

CFM y ERP Unleashed

Según el profesor Vicho la definición de estos parámetros @#%&!! es:
  • cfm chico = superficie dura
  • cfm grande = interpenetracion segura
  • erp chico = correccion al peo e interpenetracion
  • erp medio = wea estable y rapida
  • erp grande = correccion wena pero mucha cpu

muy wena , na que decir XD

viernes, noviembre 18, 2005

Vuelco en la historia

Hasta ahora he dado puro jugo con ODE, lo que implica que el resto de las clases del sistema están en un estado estable (hasta que no me de por ROAM , LOD y esas cosas), asi que próxima tarea crearme un .a con mis clases que incluya un objeto aplicación opengl, para poder armar nuevos proyectos con un mínimo de esfuerzo. Suena de perogrullo, pero si no lo escribo se me olvida. La idea es solo sobreescribier el metodo que lee el teclado ( clase app), el que carga la escena (clase world ), el que renderiza (clase world) y el que actualiza. Sistema de partículas voy por ti...

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.