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

Algorithmes et structures de données Discussion :

Detecter des collisions


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Detecter des collisions
    Bonjour,

    J'ai pas mal de mal à créer un algorithme de detection de collission valable ...


    Voici le problème :
    Je voudrais savoir si un element peut etre placé à un endroit sans rentrer en collision avec les elements déjà placé.
    Pour celà je dispose les dimenssions sur l'axe X, Y et Z de chaque élément ansi que les coordonnées du centre de la pièce sur les axe X, Y ainsi que Z.

    J'ai tout dabord pensé à celà :

    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
     
     
    code = 0, axe : entier;
    point[4] : decimal;
     
     
    Pour les 3 axes
    {
       point[0] = Coordonnée la plus à gauche de la piece a tester sur l'axe actif
       point[1] = Coordonnée la plus à droite de la piece a tester sur l'axe de la piece a tester sur l 'axe actif
     
       Pour toutes les pieces déjà placer
       {
            point[2] = Coordonnée la plus à gauche de la piece déjà placé active sur l'axe actif
            point[3] = Coordonnée la plus à gauche de la pieve déjà placé active sur l'axe actif
     
          Pour chaque points espacer de 0.5 de la piece a placer
          {
              Si le point est dans les limites de la piece active
                  declarer une collision sur l axe
           }
       }
    }

    Mais le problème, c'est qu'avec cette algo, je ne detecte pas vraiment les collisions mais plutot les similitudes et je pense que pour une collision, il doit avoir 3 similitudes sur un point.

    Mais même si je compte les similitudes par point, est-ce que je detecterai rellement toutes les collissions possibles ?

    Merci pour toute aide apporté, j'ai vraiment du mal à me l'imaginer, et faire un dessin avec de la 3D, je n'y parviens pas non plus

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Fais des recherches sur les collisions entre AABB (Axis Aligned Bounding Boxes), il y a une foule d'algos disponibles.

    Une méthode simple (mais sûrement pas optimale) est de vérifier que tous les points d'un cube se trouvent à l'exterieur d'un des plans délimitant l'autre cube.

  3. #3
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Ben en fait tu te fais une classe paraléllelépipède rectangle(tu peut l'appeler BoundingBox) avec X0,Y0,Z0 et X1,Y1,Z1 en variables membres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool BoundingBox::IsCrossing(BoundingBox Autre)
      {
      return (this->X0 <= Autre->X1 && this->X1 >= Autre->X0 && this->Y0 <= Autre->Y1 && this->Y1 >= Autre->Y0 && this->Z0 <= Autre->Z1 && this->Z1 >= Autre->Z0) ;
      }
    ça devrait suffire à te dire si elle se chevauchent...

    Pour affiner, tu peut utiliser l'ellipse englobante mais là ça devient plus galère...
    Qui va piano va sano...

  4. #4
    Membre régulier Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par Loulou24
    Fais des recherches sur les collisions entre AABB (Axis Aligned Bounding Boxes), il y a une foule d'algos disponibles.

    Une méthode simple (mais sûrement pas optimale) est de vérifier que tous les points d'un cube se trouvent à l'exterieur d'un des plans délimitant l'autre cube.
    les OBB (oriented Bounding Box) sont pas mal non plus, plus précises et pas beaucoup plus complexes

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En général pour les collisions, une bonne technique est de faire en deux temps : d'abord un test grossier à base de sphère englobante (très facile à mettre en oeuvre et très rapide), puis un test plus précis avec une hiérarchie de OBB sur l'objet ciblé, voire directement triangle par triangle si le modèle n'est pas très complexe.

    Bien sûr, après il faut voir ce que tu comptes faire comme détection de collision.

  6. #6
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Bonjour, j'aurais également besoin d'un algo de test de collision. Dans mon cas, je n'ai que des rectangles et j'ai besoin de la solution la plus optimale possible (rapidité avant tout).
    Que me conseillez vous ?

    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

Discussions similaires

  1. Detection des touches enfoncées par API
    Par Ingham dans le forum VB 6 et antérieur
    Réponses: 31
    Dernier message: 20/02/2006, 12h30
  2. [debutant]detection des contraintes
    Par jeff_13 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/02/2005, 11h01
  3. Detection des enfants avant leurs construction
    Par qqchose dans le forum C++
    Réponses: 10
    Dernier message: 12/02/2005, 17h39
  4. Gestion des collisions - terrains
    Par Dranor dans le forum DirectX
    Réponses: 1
    Dernier message: 26/06/2003, 18h50
  5. Réponses: 2
    Dernier message: 26/02/2003, 15h18

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