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 :

Collision entre deux boules (glissade et non rebonds)


Sujet :

Physique

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Collision entre deux boules (glissade et non rebonds)
    Bonjour à tous !

    Je rencontre un problème depuis plusieurs jours et j'ai besoin de votre aide.

    Je suis actuellement en train de développer un petit jeu en html/javascript (canvas) et je débute par quelques problèmes de physique. Pour l'occasion, j'ai acheté l'excellent livre "HTML 5 Animation with Javascript" de Billy Lamberta et Keith Peters.

    Dans mon jeu, chaque joueur contrôle une boule. Pour le moment, je veux simplement régler les problèmes de physique :
    - collision avec un mur
    - collision entre deux boules

    Le déplacement se fait à la souris : la boule se déplace vers le curseur de la souris. La vélocité d'une boule est donc perpétuellement changé (sa direction et sa vitesse, donc).

    C'est la collision entre deux boules qui me pose problème, je veux obtenir le comportement suivant :
    - si une boule A de masse 10 rencontre une boule B de masse 5, la boule B est projeté par la boule A. Ça me semble facile, il suffit de la faire rebondir dessus. Je ne recherche pas d'aide sur cette partie-ci.
    - si deux boules A et B de même masse se rencontrent, voici le comportement que j'aimerais adopter :
    Nom : images.png
Affichages : 1988
Taille : 5,5 Ko

    Les boules ne doivent pas se rebondir dessus, elles doivent simplement s'éviter : les deux doivent simplement "glisser" les unes sur les autres.

    Ca semple évident et facile mais je ne parviens pas à créer cet effet et je ne parviens pas à trouver d'exemple sur internet... peut-être que je n'utilise pas les bons mots clés. Tout le monde semble vouloir créer du rebond, pas moi.

    Je ne vous demande pas de code mais simplement des indications générales sur le principe à adopter. Qu'est-ce qui est le plus propre ? Comment mettre à jour les vélocités des boules A et B (a.vx, a.vy, b.vx, b.vy) ?

    Merci d'avance !

    Ephysio

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Salut

    Citation Envoyé par Ephysio Voir le message
    [...] voici le comportement que j'aimerais adopter :
    Nom : images.png
Affichages : 1988
Taille : 5,5 Ko

    Les boules ne doivent pas se rebondir dessus, elles doivent simplement s'éviter : les deux doivent simplement "glisser" les unes sur les autres.
    Euh... ce n'est pas très clair à visualiser comme comportement, ça doit s'éviter, tout en glissant... un peu louche! Sur le schéma, ça touche, donc on est loi de s'éviter... quand à glisser, autant sur un plan, j'arrive à conceptualiser le phénomène, mais sur une boule, je vois moins.

    Du coup ça doit faire quoi exactement?

    Sinon, une piste lancée au hasard, tu calcules comme pour un rebond amorti (composante normale après contact = 0 )
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Pardon, je me suis mal exprimé.

    Déjà, une précision au cas où l'usage du mot "boule" laisserait imaginer qu'on est en 3D, je parle plutôt d'un cercle (en 2D) donc.


    Ce que je cherche obtenir est similaire au comportement du cercle sur un mur :

    Nom : mur.png
Affichages : 1238
Taille : 5,8 Ko

    1) Le joueur commence à se diriger vers le mur en diagonal
    2) Il y a collision avec le mur
    3) Comme le mouvement initial était en diagonal, la boule n'est pas bloquée contre le mur, elle continue à avancer le long du mur, c'est ce que j'appelle "glisser". Il n'y a pas de rebond.

    Je veux obtenir la même chose avec deux joueurs.

    En gros, si un joueur A est arrêté et qu'un joueur B lui rentre dedans, il ne doit pas se bloquer sur lui, il doit naturellement se décaler en glissant contre le joueur A.

    Comme sur le schéma suivant : le joueur noir est arrêté, le joueur rouge arrive, il collisionne le noir, et va naturellement voir son trajet se décaler en glissant sur le bord de la boule noire, une fois la boule noire dépassée, la boule rouge continue à avancer, sans contrainte.

    Nom : mouvement.png
Affichages : 1335
Taille : 8,9 Ko

    Hésites pas à me dire si mes explications sont toujours aussi flous ^^

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Autre schéma pour expliquer :

    Nom : schema.png
Affichages : 1206
Taille : 6,5 Ko

    Le joueur noir ne bouge pas, il est immobile.

    Le joueur rouge arrive et entre en collision avec le joueur noir.

    La direction demandée par le joueur est symbolisée par la ligne violette. Le chemin réel, lui, est symbolisé par la ligne orange.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    A force de tests, on a trouvé une solution qui nous satisfait :

    Nom : schema.png
Affichages : 1299
Taille : 21,1 Ko

    Quand deux cercles se rencontrent :

    - on commence par mesurer la distance de recouvrement des deux cercles appelée : overlap

    - on calcul la fonction affine (y = ax + b) de la droite reliant les deux centres des cercles

    - on déplace les cercles de overlap/2 de chaque côté pour qu'ils ne soient plus en collision (les nouvelles coordonnées sont calculées à l'aide de la fonction affine)

    Ça fonctionne, il y a bien cet effet de "glissement" que nous recherchions. En revanche, si un joueur est immobile, l'autre pourra légèrement le pousser (ce qui est logique vu la méthode utilisée) mais ça ne nous dérange pas.

    Résolu !

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Ephysio Voir le message
    Ça fonctionne, il y a bien cet effet de "glissement" que nous recherchions. En revanche, si un joueur est immobile, l'autre pourra légèrement le pousser (ce qui est logique vu la méthode utilisée) mais ça ne nous dérange pas.
    Pour contrer ça tu peux moduler le glissement par la vitesse des joueurs :
    A s'écarte de vitesseA / (vitesseA + vitesseB) * overlap
    B s'écarte de vitesseB / (vitesseA + vitesseB) * overlap

    joueur A : 10 m/s
    joueur B : 10 m/s
    => A et B s'écartent de overlap/2 (10/20 * overlap)

    joueur A : 0m/s
    joueur B : 10 m/s
    => A ne bouge pas (0/10 * overlap)
    => B bouge de overlap (10/10 * overlap)

    etc..

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci pour l'astuce

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/11/2012, 10h33
  2. collision entre deux mobiles
    Par Bastuccio dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 24/09/2009, 08h36
  3. collision entre deux segments
    Par [Hugo] dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 01/04/2009, 15h48
  4. Collision entre deux rectangle
    Par Ouaibou dans le forum Mathématiques
    Réponses: 4
    Dernier message: 15/04/2007, 15h16
  5. Detection de collision entres deux cylindres.
    Par Sandro Munda dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/11/2006, 14h36

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