1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/**
* Fonction appelée par dSpaceCollice lorsque deux objets dans l'espace entre
* potentiellement en contact
*****/
static void nearCallback (void *data, dGeomID o1, dGeomID o2)
{
int i;
int numc;
// Création d'un tableau d'objets dContact pour retenir les joints entre eux
dContact contact[MAX_CONTACTS];
// On récupère le corps de chaque geométrie
dBodyID b1 = dGeomGetBody(o1);
dBodyID b2 = dGeomGetBody(o2);
// Test si les deux corps sont déjà connectés, si oui, on sors de la fonction
//if(b1 && b2 && dAreConnected(b1,b2))
// return;
// Mise en place des popriétés de chaque point de contact.
// i.e. la façon dont chaque point de contact doit réagir lors d'une collision
// See section 7.3.7 of the ODE manual and have fun experimenting to learn more.
for (i = 0; i < MAX_CONTACTS; i++)
{
// CFM activé en soft (rendre la surface molle) et bounce activé (rendre la surface rebondissante)
contact[i].surface.mode = dContactBounce | dContactSoftCFM;
// Mettre le coefficient de friction à infinity ( 0 : surface sans friction, dInifinity : le maximum de friction)
contact[i].surface.mu = dInfinity;
// Optionnel au cas où mu marche pas, s'applique sur la direction 2
contact[i].surface.mu2 = 0;
// Valeur de rebond (avec pour max = 1, min = 0)
contact[i].surface.bounce = 0.01;
// Vélocité minimal de l'objet entrant en contact pour qu'il y ai rebond
contact[i].surface.bounce_vel = 0.1;
// Douceur de la surface
contact[i].surface.soft_cfm = 0.01;
}
if ( !dGeomGetBody(o1) && !dGeomGetBody(o2));
// Ici, on effectue le véritable test de collision en appelant dCollidesur les 2 géométries o1 et o2
// dCollide retourne le nombre de points de contact (zéro si aucun contact)
// Outre les géométrie des objets que l'ont veux calculer et le nombre de points de contacts à considérer, on passe
// également en paramètre un dContactGeom.
// dContactGeom est une sous structure qui nous permet de passer notre tableau de contact en envoyant seulement
// le premeir élément puis on passe l'offset du prochain dContactGeom en dernier paramètre.
else if (numc = dCollide(o1, o2, MAX_CONTACTS, &contact[0].geom, sizeof(dContact)))
{
// Ajout de chaque point de contact trouvé dans notre groupe(contactgroup) en appelant la fonction dJointCreateContact
for (i = 0; i < numc; i++)
{
// dJoinCreateContact a besoin de connaître le monde, le groupe et l'objet de contact et renvoi un dJointID
// que l'on utilise pour créer un contact temporaire entre deux géométries
dJointID c = dJointCreateContact(world, contactgroup, contact + i);
dJointAttach(c, b1, b2);
}
}
} |
Partager