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

Physique Discussion :

Gestion globale des collisions


Sujet :

Physique

  1. #1
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut Gestion globale des collisions
    Bonjour à tous !

    Dans le cadre de la création d'un moteur 2D pour un jeu semi-pro, je suis en train de créer un moteur de collision, et je galère pas mal.
    Pour le moment, mon moteur est capable de déterminer le moment exact d'une collision entre deux géom (n'importe quel objet convexe) se déplaçant à une vitesse constante , c'est donc un algorithme continu. Pour gérer les collisions entre plus de deux objets, j'ai imaginé l'algorithme suivant :

    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
    tant que pas > 0 faire
        temps = +infini
        data = null
        pout tout couple (g1,g2) de géom faire
            si CollisionRapide( g1, g2 )
                si Collision(g1, g2, data2)
                    si data2.moment_de_la_première_collision < temps
                        temps = data2.moment_de_la_première_collision
                        data = data2
                    finsi
                finsi
            finsi
        finfaire
        si temps < pas
            pout tout géom g faire
                déplacer( g, temps )
            finfaire
            data.g1.collision_réponse( data )
            data.g2.collision_réponse( data )
        sinon
            pour tout géom g faire
                déplacer( g, pas )
            finfaire
        fin
        pas = pas - temps
    finfaire.
    Le principe est de trouver le couple de géom qui se collisionne en premier, de faire avancer tous les objets jusqu'à ce moment, et d'appeler la réponse à la collision pour les deux objets. On répète l'opération jusqu'à ce que le pas soit nul.

    Cet algorithme marche à peu près, mais très vite, on a des cas pour lesquels la boucle while ne termine jamais. Ce sont les cas où deux objets sont en collision aux conditions initiales, où lorsque la réponse à la collision d'un objet (la fonction collision_reponse) est mal faite. En clair, deux objets ne peuvent jamais entrer en collision sous peine de plantage. Et je n'arrive pas à résoudre ce problème !

    Mon but est de pouvoir ignorer des objets une fois qu'ils sont rentrés en collision, mais quelle que soit la méthode que j'ai essayé ça ne marche pas. Par exemple, j'ai essayé de faire un tableauà deux dimensions de booléens qui indique quels objets doivent être ignorés. J'ai aussi essayé de faire une liste de couples de géom triée par temps de collision croissante (j'ai vu cette solution sur un forum mais je ne sais plus lequel), mais rien ne marche.

    En cherchant sur le net, j'ai trouvé beaucoup d'algo pour tester la collision entre les objets (ça, pas de problème), mais aucun pour gérer le tout... Voilà, si vous avez des idées ou des algo, je suis preneur, ça m'enlèverai un poids

    PS : 50e message, je suis membre du club !

  2. #2
    Responsable Purebasic

    Avatar de comtois
    Inscrit en
    Avril 2003
    Messages
    1 261
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 1 261
    Points : 9 924
    Points
    9 924
    Billets dans le blog
    8
    Par défaut
    Cet algorithme marche à peu près, mais très vite, on a des cas pour lesquels la boucle while ne termine jamais.
    Perso j'avais utilisé ce tutoriel pour gérer les collisions dans mes démos 3D. ça fonctionne plutôt bien. Ce tutoriel utilise un compteur dans la boucle 'réponse', tu peux cesser de traiter la réponse après 5 réponses par exemple.

    Après est-ce suffisant dans ton cas ? A voir, pour moi ça donne de bons résultats en 3D.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Je n'avais pas pensé à cette méthode... Je vais la mettre en œuvre dès maintenant, et on va voir ce que ça donne

    En tout cas, merci pour ta réponse !

  4. #4
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Me revoilà. J'ai mis en œuvre la solution proposé, et ça marche super bien ! J'arrive à faire une simulation où des balles rebondissent contre les murs et se collisionnent entre elles.

    Pour l'info, j'ai effectivement mis un compteur qui sert à ignorer des couples d'objets au bout d'un certain nombre collisions (4 est suffisant), et j'ai optimisé un peu dans la fonction de déplacement. Au lieu de mettre :

    j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    déplacer(g,temps-epsilon)
    Cela permet d'arrêter les objets juste avant leur collision et de ne pas incrémenter le fameux compteur.

    Il reste enfin un dernier bug, lorsque un objet se trouve "en sandwich" entre deux autres objets. Dans ce cas, l'objet rebondit un certain nombre de fois, puis passe au travers les deux autres, ce qui est normal vu la définition du compteur de collision. Ce problème n'est pas grave, puisque mon but n'est pas de faire un moteur physique mais "juste" un moteur de collision, dans lequel les objets ne rebondissent pas vraiment les uns contre les autres.

    En tout cas, merci de ta réponse !

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

Discussions similaires

  1. Gestion globale des erreurs
    Par hubsm dans le forum Services Web
    Réponses: 2
    Dernier message: 03/10/2011, 10h40
  2. Gestion simple des collisions et de la gravité
    Par fab56 dans le forum Physique
    Réponses: 2
    Dernier message: 11/11/2010, 05h45
  3. Réponses: 10
    Dernier message: 26/11/2009, 10h05
  4. Gestion globale des erreurs
    Par claire_S dans le forum Struts 2
    Réponses: 5
    Dernier message: 20/04/2009, 11h24
  5. [infos utile+code] -> gestion exacte des collisions
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 13/01/2009, 20h18

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