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

Composants Java Discussion :

Gestion des Collisions


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut Gestion des Collisions
    Bonjour,

    Je bosse actuellement sur un projet en Java pour ma 3ème année de licence informatique qui est la création d'une "Simulation de Gravité". J'ai donc crée 3 objets physiques pour le tester. Un Rond, un Rectangle et un Triangle Rectangle qui héritent tout trois d'une classe abstraite Physique et qui redéfinissent différentes fonctions. Ces objets dans mon programme sont stockés dans une ArrayList<Physique>

    J'ai réussi à gérer la création d'un objet à une certaine position lors d'un clic de souris, sélectionner, supprimer, modifier la taille de ces objets, bref, je me suis bien amusé sur ceux ci, mais j'arrive à un point ou je dois avancer dans les collisions. Je suis une vraie bille en physique, et je ne sais pas du tout comment m'y prendre.

    J'ai besoin de pistes pour :

    - détecter une collision entre les divers objets modélisés (Rond, Rectangle et Triangle, et bien sûr les bords de ma fenêtre, mais pour cela c'est assez simple)
    - appliquer une force à chaque objet qui entre en collision
    - appliquer un moment à chaque objet qui entre en collision

    J'ai une fonction union qui détecte si un point précis de coordonnées x et y se trouve dans l'objet, dont voici le code

    Pour un rectangle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean union(int x, int y) {
        return (x >= this.x && x <= this.x + l && y >= this.y && y <= this.y + h);
    }
    Pour un rond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean union(int x, int y) {
        return Math.sqrt(Math.pow(x - this.x - 20, 2) + Math.pow(y - this.y - 20, 2)) < r;
    }
    Pour un triangle rectangle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean union(int x, int y) {
        return (x >= this.x && x <= this.x + c && y >= this.y && y <= this.y + c && this.x - x >= this.y - y);
    }
    Merci par avance pour votre aide. Je ne vous demande pas bien sûr de faire le travail à ma place, mais si vous avez quelques pistes de réflexion, je suis preneur !

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Il existe pleins de techniques plus ou moins compliquée et plus ou moins rapide.

    En voici une pas très compliquée et moyennement rapide. Attention, elle ne fonctionne que pour des polygones convexes : tu détermines une boite carrée qui englobe chacun des tes objets. La boite carrée doit être suffisamment grande pour englober l'objet, quelque soit sa rotation. Une boite carrée est déterminée par le centre de gravité de l'objet et son côté qui est le double de la plus grande distance entre le centre de gravité et son sommet le plus loin (pour permettre une rotation complète). Ce calcul est fait une fois pour toute.

    Une première fonction détermine la position de toutes les boites carrées entre elles. Selon la distance de leurs centre deux à deux et la demi-largeur respective des deux boites, tu peux facilement savoir si deux boites se chevauchent. Le nombre de vérification est une combinaisons de 2 parmi N objets. Pour deux boites B1 et B2, tu prends la valeur absolues de la différences des abscisses des deux centres. Tu fais la même chose pour l'ordonnée. Si les deux différences sont inférieures à la somme des demi-cotés des deux boites, alors les deux boites se chevauchent.
    Ces calculs sont très rapide.

    Pour chaque couple de boites carrées qui se chevauchent, tu fais une analyse plus fine sur les deux objets physiques en utilisant les sommets.
    Soit P1 le premier objet et P2 le second. Tu vérifies pour chaque sommet s'il est à l'intérieur de P2, et tu fais de même pour les sommet de P2 sur P1. Si un sommet est à l'intérieur du second objet, alors il y a collision. Il ne te reste plus qu'à calculer les nouvelles trajectoires pour ces deux objets.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Merci pour ta réponse, je vais déjà travailler sur ta méthode qui ne devrait pas trop poser de problèmes à coder.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Soit P1 le premier objet et P2 le second. Tu vérifies pour chaque sommet s'il est à l'intérieur de P2, et tu fais de même pour les sommet de P2 sur P1. Si un sommet est à l'intérieur du second objet, alors il y a collision. Il ne te reste plus qu'à calculer les nouvelles trajectoires pour ces deux objets.
    Je ne saisis pas très bien comment effectuer cette vérification pour un cercle, qui est sensé avoir un nombre infini de sommets. Dois-je simplifier en ne prenant qu'une approximation (16, 32 sommets à distances égales ?), ou existe t-il une méthode plus simple ?

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Attention, mon idée est présentée pour des polygones convexes.
    Tu peux imaginer l'adapter pour des cercles. Approximer ton cercle en polygone régulier me semble être effectivement la solution.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Je n'aurai pas de polygone non convexe à traiter, cette solution me paraît donc parfaitement adaptée à mon problème.

    Merci beaucoup

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 12
    Par défaut
    Je reviens pour un problème supplémentaire, qui concerne cette fois les actions à effectuer en cas de collisions. La détection marche nickel, mais je rame depuis mon dernier message pour déterminer les nouvelles vitesses, les directions et la rotation de mes objets en cas de collision...

    J'ai trouvé cet article : http://director-online.com/buildArticle.php?id=532

    Il me semble très intéressant, mais étant une véritable bille en physique, je n'arrive pas du tout à comprendre quoi que ce soit. Je pensais qu'il suffirait de deux bêtes formules déterminant les nouvelles vitesses en X et en Y de mon objet, une formule pour la rotation et c'est tout. Seulement, j'ai l'impression que c'est beaucoup plus compliqué que ça.

    Quelqu'un aurait-il l'amabilité de m'aider ? Merci !

Discussions similaires

  1. gestion des collisions avec sdl
    Par kirtap1969 dans le forum SDL
    Réponses: 3
    Dernier message: 18/10/2007, 21h16
  2. Hashtable et gestion des collisions
    Par nicoland dans le forum Framework .NET
    Réponses: 3
    Dernier message: 21/05/2007, 12h28
  3. [FLASH 8] Gestion des collisions
    Par celinha dans le forum Flash
    Réponses: 12
    Dernier message: 23/06/2006, 11h15
  4. Importer avec Ogre / Gestion des collisions
    Par alex6891 dans le forum Ogre
    Réponses: 9
    Dernier message: 19/02/2006, 17h43
  5. Gestion des collisions - terrains
    Par Dranor dans le forum DirectX
    Réponses: 1
    Dernier message: 26/06/2003, 18h50

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