Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COLLISIONS EN 2D : AXES SÉPARATEURS


Information sur la source



Description

Cliquez pour voir la capture en taille normale
Voici une petite source illustrant une technique très simple de test de collisions entre polygones en 2d qui peut être utilisée dans les jeux vidéos par exemple.

Le test de collision entre 2 polygones s'effectue en deux temps :
1) Test approximatif : test sur les enveloppes rectangulaire des deux polygones, si les rectangles se touchent, un test plus détaillé est effectué. Le test sur les rectangles permettent d'optimiser la vitesse de détection des collisions car le test entre 2 rectangles est très très rapide et simple
2) Si le test approximatif réussi, on effectue un test plus précis. Le test utilise la technique basée sur le théorème des axes séparateurs ! c'est une technique assez simple (il suffit de regarder le code de collision, il fait a peine 10 lignes) et assez précise.

Technique des axes séparateurs :
En gros, pour dire que deux polygones ne se chevauchent pas, il faut être capable de tracer une ligne entre les deux ne touchant pas les 2 polygones. Dans le cas contraire, les deux polygones se touchent.
Plus mathématiques :
1) On récupère tous les axes séparateurs possibles pour les deux polygones. Pour les polygones, les axes sont les normales a chaque face des polygones! donc il y a autant d'axes que de face et il est super facile de calculer une normale a une face (regarder vos cours de géométrie euclidienne!)
2) on projette les points des deux polygones sur chaque axes (un produit scalaire suffit...) et on prends pour les deux polygones, les points extrêmes des projections sur l'axe.
3) si le segment des points extrêmes du 1er polygone chevauche le segment du 2eme polygone, on dit que l'axe n'est pas séparateur (il est séparateur si les deux segments sont disjoints)
4) on dit que le polygone ne touche pas l'autre polygone s'il existe un axe pour lequel l'axe est séparateur. Si tous les axes ne sont pas séparateurs, les polygones se touchent!

Je recommande un petit coup d'oeil sur le site http://www.flashxpress.net/wikimedia/index.php/D%C3%A9tection_De_Collision qui illustre les axes séparateurs avec de jolies animations en Flash.

La source :

La code de démonstration montre des polygones 2d qui tombent, dés qu'un objet touche un autre, il s'arrête. C'est pas très beau mais c'est un bon exemple de démonstration de collisions. La source pourrait très bien servir de point de départ pour un bon vieux Tetris... :)
 

Conclusion

Dans le zip, le projet pour Netbeans (j'ai codé sou Netbeans 6 beta mais je pense que le projet est compatible Netbeans 5.5) et est directement compilable/exécutable avec Java 6

Pour ceux qui ont pas Netbeans, il faut compiler le répertoire src/ et exécuter la classe MainFrame
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Collision2d
    •   build
      •   classes
        •   org
          •   collision2d
            •   main
              • MainFrame$1.classTélécharger ce fichier [Réservé aux membres club]1 651 octets
              • MainFrame$2.classTélécharger ce fichier [Réservé aux membres club]1 220 octets
              • MainFrame.classTélécharger ce fichier [Réservé aux membres club]6 507 octets
            •   math
              • Base2d.classTélécharger ce fichier [Réservé aux membres club]1 316 octets
              • Collisions.classTélécharger ce fichier [Réservé aux membres club]2 639 octets
              • Point2d.classTélécharger ce fichier [Réservé aux membres club]1 663 octets
              • Vector2d.classTélécharger ce fichier [Réservé aux membres club]3 204 octets
            •   objet
              • BasicObjetModel.classTélécharger ce fichier [Réservé aux membres club]4 061 octets
              • BasicObjetView.classTélécharger ce fichier [Réservé aux membres club]1 906 octets
              • ObjetBaseModel.classTélécharger ce fichier [Réservé aux membres club]2 439 octets
              • ObjetBox.classTélécharger ce fichier [Réservé aux membres club]681 octets
              • ObjetModel.classTélécharger ce fichier [Réservé aux membres club]406 octets
              • ObjetView.classTélécharger ce fichier [Réservé aux membres club]282 octets
      •   depcache
    •   dist
      • Collision2d.jarTélécharger ce fichier [Réservé aux membres club]30 951 octets
      • README.TXTTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 307 octets
    •   nbproject
      •   private
        • profiler
        • private.propertiesTélécharger ce fichier [Réservé aux membres club]194 octets
        • private.xmlTélécharger ce fichier [Réservé aux membres club]Voir ce fichier211 octets
      • build-impl.xmlTélécharger ce fichier [Réservé aux membres club]Voir ce fichier31 009 octets
      • genfiles.propertiesTélécharger ce fichier [Réservé aux membres club]455 octets
      • project.propertiesTélécharger ce fichier [Réservé aux membres club]1 779 octets
      • project.xmlTélécharger ce fichier [Réservé aux membres club]Voir ce fichier581 octets
    •   src
    • test
    • build.xmlTélécharger ce fichier [Réservé aux membres club]Voir ce fichier3 370 octets
    • manifest.mfTélécharger ce fichier [Réservé aux membres club]85 octets

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de coucou747 le 23/05/2007 04:21:19

c'est interessant comme algo, moi je croyais que tout ca se faisait a partir de divisions en triangles et verification qu'aucune ligne ne se croise...

signaler à un administrateur
Commentaire de tucobouch le 23/05/2007 19:02:35

La division en triangle est surtout utilisée pour les polygones sur des objets 3d. Il existe bien d'autre techniques de collision différentes (il suffit de voir sur Google), celle çi en est une qui est très simple et adaptée à pas mal de jeu

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Dessiner un graphique 2D en java [ par afura2004 ] Salut tout le monde...j'aimerais savoir comment je fais pour dessiner un "horizontal bar graphic" et l'intégrer dans un cadre interne d'une applicatio Repère orthonormé [ par mikito ] Bonjour tout le monde, voila ma kestion :j'ai un tableau (avec des x et des y) et je veux faire un graphique dans un repère classique orthonormé avec point à l'interrieur d'un polygone? [ par jmg02001 ] Bonjour,connaîtriez vous un moyen de déterminer si un point se trouve à l'intérieur d'un polygone ou une class qui le fait SVP?Merci Création Graph 2D [ par maxinfos ] Bonjour,j'aimerais savoir comment faire un graphique en 2D sur une JFrame à partir de points A(x, y) , B(x, y) et C(x, y) .... que dois-je ajouter com collision en java3D [ par domione ] Bonjour,J'ai un soucis avec les collisions en J3D.J'ai 3 objets: 1 objet chargé à partir d'un wrl, 1 cube et 1 shape3D. Je souhaite détecter uniquemen Rotation souris [ par nouse ] Salut!Bon j ai un souci dans mon code j aimerais affecter à la souris une rotation suivant l'axe des Z à la place de l'axe des X, tout en conservant l JSP et Graph (initialiser axe ordonnée) [ par Tazofsid ] bonjour, j'ai un souci pour initialiser l'axe des ordonnées sur un graph "simple" Bar.j'utilise me semble t'il la bonne méthode , mais elle est sans r Rotation en java 2d [ par Spawnrider ] bonjour,Je voudrais savoir comment peux t'on faire pour faire pivoter par exemple un rectangle composé de plusieurs petit rectangle afin d'avoir une v affichage 2d java [ par popech ] Salut, je suis en train de développer un bomberman pour les cours :s et je ne sais pas comment générer l'affichage 2d a partir de d'image.Par exemple detection de collision de 2 objets [ par a_farsi ] bonojour je cherche un exemple simple de collision de 2 objets,


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.