IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ODE Discussion :

Collision avec ODE


Sujet :

ODE

  1. #1
    Membre régulier Avatar de chasse
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 78
    Points : 78
    Points
    78
    Par défaut Collision avec ODE
    Bonjour

    je suis entrain de créer un jeu de curling en openGl en m'aidant de la librairie ODE.

    J'ai crée les pierres en opengl et des spheres transparentes avec ODE qui suive le trajet de mes pierres et me communiquent lorsqu'il y a une collision entre mes pierres avec la fct suivante :

    void nearCallback (void *data, dGeomID o1, dGeomID o2)
    {
    printf("collision");
    }

    Mais je ne sais pas comment faire pour avoir les informations qu'il me faut sur l'angle entre les 2 objets o1 et o2.

    pouvez-vous m'aider

    merci bcp

    Jonas

  2. #2
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Les informations nécessaire au traitement de collisions entre deux objets en 3D sont :
    -> Le point de collision
    -> La normale au plan de collision
    -> La profondeur de la collision
    -> Les deux objets entrés en collisions

    Le point de collision est le point dans l'espace ou se trouve le chevauchement des objets.

    La normale au plan de collision est la normale du plan qui au voisinage de la collision sépare l'espace en deux parties, chaque partie contenant un objet de la collision. C'est assez abstrait à comprendre, mais quand on plonge dans le traitement des collisions on se rends compte qu'a partir de ce plan on peut générer un repère local à la collision et la traiter correctement en prenant en compte tout sortes de choses : frottements, phénomènes d'adérence.

    La profondeur de la collision est la longueur du segment [AB] défini ainsi :
    (AB) est portée par la normale à la collision et passe par le point de collision. A et B sont tels que [AB] est le plus grand segment de l'intersection des deux solides.

    Avec ces informations il est possible de résoudre la collision. Cette résolution se passe en 2 temps :
    -> Le repositionnement
    -> La réaction

    Le repositionnement est l'action qui va simuler la non pénétration des deux objets, quand on lance une balle sur un mur, elle ne rentre pas dans le mur, pourtant dans un jeu on détecte la collision seulement quand la balle est dans le mur. Le repositionnement vise donc à replacer les objets de manière cohérente avant la frame suivante.
    Il y a plusieurs politiques pour le repositionnement. Demande moi si ça t'intéresse.
    La réaction est l'action qui va travailler sur les objets qui étaient en collision pour qu'ils réagissent de manière physiquement acceptable. Création et applications des efforts qui vont changer la vitesse, l'accélération, le moment cinétique et la quantité de mouvement pour que l'évolutions des deux objet après la collision soient physiquement acceptable. Dans certains cas la réaction est assez simple à mettre en oeuvre, par exemple pas de friction, objets ponctuels, etc....
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  3. #3
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Alors Rafy, tres interesant tout ca, merci!

    Sinon, ode fais tout ca, il suffit de créer tes objets modelisé en opengl, et les passer a ODE en tant que trimesh, ( lire la FAQ ODE ), puis le nearCallback() devrait ressemblre plus ou moins a ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    static void nearCallback(void *data, dGeomID o1, dGeomID o2)
    {
      int i;
      // exit without doing anything if the two bodies are connected by a joint
      dBodyID b1 = dGeomGetBody(o1);
      dBodyID b2 = dGeomGetBody(o2);
      if (b1 && b2 && dAreConnected (b1,b2)) return;
     
      dContact contact[3];            // up to 3 contacts per box
      for (i=0; i<3; i++)
      {
        contact[i].surface.mode = dContactSoftCFM | dContactApprox1;
        contact[i].surface.mu = 0.9;
        contact[i].surface.soft_cfm = 0.2;
      }
      if (int numc = dCollide (o1,o2,3,&contact[0].geom,sizeof(dContact)))
      {
        for (i=0; i<numc; i++)
        {
          dJointID c = dJointCreateContact (world,contactgroup,contact+i);
          dJointAttach (c,b1,b2);
        }
      }
    }

  4. #4
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    hum, je ne connais pas ODE, mais par contre je connais pas trop mal les collisions...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  5. #5
    Membre régulier Avatar de chasse
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 78
    Points : 78
    Points
    78
    Par défaut
    Comment je peux faire si je connais l'angle, la position des 2 pierres qui sont en collision et le vecteur vitesse?
    parce que avec trimesh g du mal la...

    merci

  6. #6
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Tu parles de quel angle ? De l'angle entre le vecteur vitesse et l'horizontale ? Ou d'un autre angle ?
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  7. #7
    Membre régulier Avatar de chasse
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 78
    Points : 78
    Points
    78
    Par défaut
    voici un petit croquis de la situation.
    Au départ une pierre avec un angle connu (angle avec horizontale)
    va percuter une autre pierre a l arret.
    Connu :

    angle
    vecteur vitesse de la première pierre

    Recherché :

    vecteur vitesse des deux pierres après chocs
    angle des 2 pierres avec horizontales.


    Merci bcp
    Images attachées Images attachées  

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    hum pas très facile à utiliser l'angle la, je croyais que tu allias me donner un autre angle...
    Bientôt un tuto sur les collisions pourra te guider.
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

  9. #9
    Membre régulier Avatar de chasse
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 78
    Points : 78
    Points
    78
    Par défaut
    merci rafy tiens moi au courrant...

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut même problème
    Bonjour,

    désolé de deterrer un vieux topic, mais j'ai un problème similaire. J'essai d'utiliser ODE à l'aide de la dll, car je travail sous PureBasic.

    et ma fonction nearCallback ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ProcedureC nearCallback(*donnes, o1.l, o2.l)
     
      Define b1.l, b2.l, c.l, num.l
     
      ; récuperer les ID des body des géométrie en contact
      b1 = ode_dGeomGetBody(o1)
      b2 = ode_dGeomGetBody(o2)
     
      ; quitter la fonction si les 2 objet sont liés
      If b1 & b2
        If ode_dAreConnected(b1,b2)
          ProcedureReturn 0
        EndIf
      EndIf
     
      ; définir le nombre de contact max
      Define maxC.b = 10
     
      Dim contact.contact(maxC-1)
     
      For i=0 To maxC-1
     
        contact(i)\surface\mode = #ode_dContactSoftCFM | #ode_dContactApprox1
        contact(i)\surface\mu = 0.9
        contact(i)\surface\soft_cfm = 0.2
     
      Next i 
     
      ; récupere le nombre de contact
      num = ode_dCollide(o1, o2, maxC,@contact(), SizeOf(contact))
     
      ; si il y a contact
      If num
     
        For i = 0 To num-1
     
          c = ode_dJointCreateContact (idW, 0, @contact() + i*SizeOf(contact))
          ode_dJointAttach(c, b1, b2)
     
        Next i
     
      EndIf
     
    EndProcedure
    J'ai fait cette fonction à partir de celle d'Happy.

    Résultat : J'ai une boule qui tombe sur une autre non soumise à la gravité. Quand les boules entres en collision Elles disparaissent aux coordonnées (1.#QNAN0, 1.#QNAN0, 1.#QNAN0). Je pense que 1.#QNAN0 ca veut dire "indéfinie".

    Quelqu'un a déjà eu ce problème avec ode ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut résolu
    J'ai trouvé l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ; récupere le nombre de contact
      num = ode_dCollide(o1, o2, maxC, @contact() + SizeOf(surface), SizeOf(contact))
    j'avais oublié simplement le' + SizeOf(surface)'.

    J'ai quelques questions concernant les réglages, je les posterais dans un nouveau sujet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de "collision" avec un "EDIT"
    Par Darkenshin dans le forum Windows
    Réponses: 2
    Dernier message: 31/05/2007, 13h21
  2. Comment obtenir l'équation avec ODE
    Par mutwit dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/04/2007, 19h42
  3. Réponses: 4
    Dernier message: 21/03/2006, 17h38
  4. Collision avec le sol...
    Par conrad dans le forum Physique
    Réponses: 15
    Dernier message: 09/08/2005, 02h18
  5. Collision avec 3ds ou ms3d
    Par goutbouyo dans le forum Physique
    Réponses: 3
    Dernier message: 29/03/2005, 12h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo