Calculer la collision entre deux billes.

De la mécanique au nucléaire, nos physiciens sont à l'écoute
nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

calculer la collision entre deux billes.

par nouknouk » 22 Aoû 2007, 19:04

Bonjour à tous,

voilà, je suis en train de développer un petit jeu avec des billes qui s'entrechoquent (en 2D, genre billard).

J'aimerais comprendre comment gérer une collision entre deux billes (A et B). Chacune a une position (PosA, Poas), un rayon (Ra, Rb), une Vitesse (Va, Vb), une masse (Ma, Mb).

Pour qu'on parle tous de la même chose, je joins un petit schéma avec quelques notations:

- le vecteur qui va de PosA à PosB (Vab)
- un vecteur normal à Vab : VNab.

Image

Voilà. J'aimerais savoir comment calculer les deux vecteurs de vitesse (Va et Vb) issus de la collision à partir de ces infos.
Comme ce genre de test est à effectuer un grand nombre de fois par seconde, l'idéal serait de n'utiliser que des opérations simples (+ - x /) et éviter autant que possible les calculs gourmands en ressources processeurs ( (co)sinus, racine carrée, ...).

Si vous avez une idée, merci d'avance :happy2:

EDIT: le but étant de faire un jeu 'simple', je ne veux pas un modèle complexe, mais quelque chose de simple(iste ?). Par exemple, je ne veux pas prendre en compte les moments de chaque bille, l'élasticité de la matière composant chaque bille, ...



anima
Membre Transcendant
Messages: 3762
Enregistré le: 15 Sep 2006, 11:00

par anima » 22 Aoû 2007, 19:08

nouknouk a écrit:Bonjour à tous,

voilà, je suis en train de développer un petit jeu avec des billes qui s'entrechoquent (en 2D, genre billard).

J'aimerais comprendre comment gérer une collision entre deux billes (A et B). Chacune a une position (PosA, Poas), un rayon (Ra, Rb), une Vitesse (Va, Vb), une masse (Ma, Mb).

Pour qu'on parle tous de la même chose, je joins un petit schéma avec quelques notations:

- le vecteur qui va de PosA à PosB (Vab)
- un vecteur normal à Vab : VNab.

Image

Voilà. J'aimerais savoir comment calculer les deux vecteurs de vitesse (Va et Vb) issus de la collision à partir de ces infos.
Comme ce genre de test est à effectuer un grand nombre de fois par seconde, l'idéal serait de n'utiliser que des opérations simples (+ - x /) et éviter autant que possible les calculs gourmands en ressources processeurs ( (co)sinus, racine carrée, ...).

Si vous avez une idée, merci d'avance :happy2:

As-tu fait un tel truc en physique? Parce qu'avant:
- Sache que toute collision simultanee de 3 boules est régie par le chaos le plus complet
- Que les frottements ne sont pas considérés (mais ca a la limite, on s'en fiche, on joue au billard)

Enfin, si ca t'intéresse toujours, pendant un choc, il y a conservation d'énergie cinétique dans toutes les dimensions du repere. Ainsi, tu peux dire que:
dans toutes les dimensions de l'espace...si je me souviens bien de mes cours de cinématique de l'an dernier.

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 22 Aoû 2007, 19:21

anima a écrit:As-tu fait un tel truc en physique? Parce qu'avant:
- Sache que toute collision simultanee de 3 boules est régie par le chaos le plus complet
- Que les frottements ne sont pas considérés (mais ca a la limite, on s'en fiche, on joue au billard)


Je ne comprends pas bien le sens de ta remarque:
- je ne parle que de deux boules, pas trois ou plus. Plus précisément (je me suis peut-être mal exprimé) je compte faire une grand nombre de calculs de collisions entre deux boules par seconde, pas des calculs de collisions impliquant un grand nombre de boules en même temps.

- les frottements ne seront effectivement pas pris en compte, ni les moments, ni ... rien d'autre que vitesse, position, masse, rayon.

- je parle d'un choc parfaitement élastique.

- ça doit être faisable, vu que les simulations de billard bien plus complexes existent.

Enfin, si ca t'intéresse toujours

Euh ... ben ... oui ...

L'énrgie cinétique est conservée, ok. Mais, dans la mesure du possible, je serais très heureux si je pouvais avoir quelque chose d'un peu plus "pragmatique", genre :

Va' = ceci fois cela Va + ceci fois cela Ma, Etc...

Merci d'avance :we:

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 22 Aoû 2007, 19:29

Par exemple, j'ai déniché sur Wikipédia cette formule pour une collision parfaitement élastique entre deux points:

Image

La question que je me pose est la suivante : sur wikipédia, on parle de collisions entre deux points. Puis-je appliquer la même formule pour deux boules qui ont chacune un rayon différent et surtout non nul ?

Ca me semble pas le cas, car avec deux boules de meme masse (m1 = m2), on obtient : v'1 = v2 et v'2 = v1.

anima
Membre Transcendant
Messages: 3762
Enregistré le: 15 Sep 2006, 11:00

par anima » 22 Aoû 2007, 19:52

nouknouk a écrit:Par exemple, j'ai déniché sur Wikipédia cette formule pour une collision parfaitement élastique entre deux points:

Image

La question que je me pose est la suivante : sur wikipédia, on parle de collisions entre deux points. Puis-je appliquer la même formule pour deux boules qui ont chacune un rayon différent et surtout non nul ?

Ca me semble pas le cas, car avec deux boules de meme masse (m1 = m2), on obtient : v'1 = v2 et v'2 = v1.

En considérant la boule comme ponctuelle, oui. Sinon, tu considere les points de contact comme ponctuels.

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 22 Aoû 2007, 20:15

anima a écrit:En considérant la boule comme ponctuelle, oui. Sinon, tu considere les points de contact comme ponctuels.

Effectivement, c'est ce que je compte faire. En considérant le point de contact est ponctuel (appelons le 'C', l'intersection entre Vab et VNab), ça me donnerait quoi comme genre de formule ?

vinch
Membre Naturel
Messages: 50
Enregistré le: 20 Juin 2007, 21:04

par vinch » 22 Aoû 2007, 23:18

Les equations que tu as tiré de wikipedia ne peuvent marcher que si les deux billes sont sur le meme axe (les vecteurs vitesses ont la meme direction).
car si on considère que la quantité de mouvement a des composants suivant x et y :

nous projettons tout ça on a 3 equations pour 4 inconnues :
equation 1: conservation de la qtt de mouvement en x
equation 2: conservation de la qtt de mouvement en y
equation 3: conservation de l'énergie totale
et là dur dur tu peux plus résoudre ...

y a bien un moyen de gruger ... en se plaçant dans le referentiel du centre de masses (sur le point de gravité des deux masses) à ce moment là les deux billes sont toujours alignées et tu peux résoudre avec l'équation que tu as cité précédament.
Je réfléchis à un codage informatique simple mais pour l'instant je l'ai pas (car calculer le mouvement d'un centre de masse de plusieurs points, je n'ai jamais vu ça dans un moteur physique aussi simple que celui que tu veux faire ....)
ça demande reflexion !

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 23 Aoû 2007, 00:48

re,

merci d'avoir pris le temps de t'intéresser à ma petite colle.

J'ai pris un peu plus de temps pour me sortir les doigts du c.. et j'ai un peu réactivé mes neurones matheux (depuis la prépa qu'ils étaient endormis, et ça a pas été facile de réveiller tout ce petit monde ... j'ai honte...).

y a bien un moyen de gruger ... en se plaçant dans le referentiel du centre de masses (sur le point de gravité des deux masses) à ce moment là les deux billes sont toujours alignées et tu peux résoudre avec l'équation que tu as cité précédament.

C'est justement à partir des points de gravités et Vab que je m'en suis sorti. J'ai, me semble-t-il trouvé une solution acceptable, visuellement parlant:

en cas de collision entre deux balles a et b, j'ai ce genre d'algo (avec '*' = multiplication et '.' = produit scalaire).

Code: Tout sélectionner
        Vecteur Vab = posB - posA;
       
        Vecteur VabNormalized = Vab normalizé
        Vecteur VaScalairized = VabNormalized * (VabNormalized.Va);
        Vecteur VbScalairized = VabNormalized * (VabNormalized.Vb);       

        Vecteur diffScalaires = VbScalairized - VaScalairized;
       
        newVa = Va + diffScalaires;
        newVb = Vb - diffScalaires;


voilà.

J'ai trouvé la solution 'au nez' en testant mes 'intuitions' de façon empirique, comprendre par là que j'ai intégré les différents essais d'algo dans un petit programme Java pour afficher sorte de table de billard avec quelques billes qui se déplacent et s'entrechoquent.

Outre le résultat qui me semble convaincant, graphiquement parlant, j'ai également vérifié que la somme des normes des vitesses de toute les billes était constante (donc l'énergie du système conservée)

Il y a donc peut-être une (ou des) erreurs. N'hésitez pas si vous en voyez...

A noter qu'avec mon algo, on considère implicitement que les billes ont la même masse. Je vais voir pour intégrer ce paramètre supplémentaire ... demain ... parce que là fo ptet que je dorme pour aller au boulot demain ;)

Si vous avez des remarques ou besoin de détails supplémentaires, n'hésitez pas.

vinch
Membre Naturel
Messages: 50
Enregistré le: 20 Juin 2007, 21:04

par vinch » 23 Aoû 2007, 13:58

Après quelques calculs et un retour sur mes cours de mecanique j'ai bien la confirmation de ce que j'avançais, à savoir pour une collision en 2D très générale on ne peut pas trouver les deux vitesses résultantes (4 equations 3 inconnues scalaires). Il faut une derniere information (par exemple on sait avec quel angle repart une des deux billes ...).

Dans le referentiel du centre de masse on obtient :
v1'= (v1*(m1-m2) +2*m2*v2) / (m1+m2) et
v2'= (v2*(m2-m1) +2*m1*v1) / (m1+m2)
avec v1 et v2 les vitesses dans le CDM et v1' et v2' les vitesses dans le CDM apres la collision
ici les equations sont très simples mais encore une fois l'axe "bille1/bille2 avant" et "bille1/bille2 apres" sont décalés d'un angle qu'on ne connait pas à priori ... pourtant comme tu l'as dit des modèles existent bien par exemple ici alors ont-ils choisit cette derniere information arbitrairement ?
maintenant la question va me travailler .... si quelqu'un connait une solution il sera le bienvenu ....

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 23 Aoû 2007, 15:44

vinch a écrit:ici les equations sont très simples mais encore une fois l'axe "bille1/bille2 avant" et "bille1/bille2 apres" sont décalés d'un angle qu'on ne connait pas à priori ...


So on considère la limite lorsque x --> 0 de (Tcollision - x) d'une part et (Tcollision + x). On se rapproce de l'instant de collision selon qu'on se place juste avant ou juste après la collision (donc avec V1,V2 d'une part et V'1, V'2 d'autre part).

Si on montre que les normes de chacunes des vitesses V1, V2, V'1 et V'2 est borné de par la conservation de l'énergie, avec x --> 0, on a le changement de position des billes, dépendante de la vitesse qui tend lui aussi vers zéro.

Si les billes sont à la même place, l'axe ne change pas d'angle. On peut donc peut-être considérer que l'axe est invariant dans nos équations ?

Ca te paraît cohérent ou c'était trop beau pour être "pas trop faux" ?

vinch
Membre Naturel
Messages: 50
Enregistré le: 20 Juin 2007, 21:04

par vinch » 23 Aoû 2007, 16:05

non malheuresement ça ne marche pas, la conservation d'énergie te donne une relation scalaire entre les vitesses avant et apres la collision, si on se réfère seulement à cette loi, rien n'empeche par exemple tes deux billes de repartir ensemble du meme coté pourvu que la somme des energies cinétiques soit égale à l'énergie cinétique totale avant la collision ...
heuresement ce résultat qui parait totalement impossible est bien interdit par l'autre équation (vectorielle celle ci) qui est la conservation de la quantité de mouvement.
Tu as donc un nombre de solutions possible et elles sont toutes viables physiquement. J'ai réfléchis à ton programme, il te manque donc une seule donnée pour résoudre les equations, tu n'as qu'à la choisir arbitrairement, toutes les equations concernant le choc elastique seront respectées, tu auras un modèle correct.

Par exemple tu n'as qu'à tirer au hasard entre 0 et pi/2 l'angle avec lequel une des deux billes repart, tu en déduis l'angle avec lequelle l'autre doit partir et les vitesses respectives des deux billes.

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 23 Aoû 2007, 23:38

Bon, je vous donne un petit lien d'un programme en java qui devrait être capable de se lancer tout seul ... si tout se passe bien : COLLISIONS.

Note : vous devez avoir Java 1.5 ou plus d'installé (quoique, il se peut que le téléchargement de Java soit proposé automatiquement si vous ne l'avez pas encore). Logiquement après avoir cliqué, une fenêtre indiquant le téléchargement d'un fichier 'collisions.jnlp' apparaîtra. Cliquez sur quelque chose comme 'exécuter' ou bien 'ouvrir avec Java web start'.

La fenêtre s'affiche avec quelques billes en mouvement. Quand toutes les billes sont immobiles, une sorte de viseur (ligne jaune) permet de choisir une nouvelle direction pour redonner une impulsion à la bille la plus noire.

Tout n'est pas parfait, loin de là, mais c'est une première ébauche fonctionnelle.

Si vous avez des idées / remarques ... comme toujours ... n'hésitez pas :)

Quidam
Membre Complexe
Messages: 3401
Enregistré le: 03 Fév 2006, 16:25

par Quidam » 24 Aoû 2007, 08:47

vinch a écrit:Après quelques calculs et un retour sur mes cours de mecanique j'ai bien la confirmation de ce que j'avançais, à savoir pour une collision en 2D très générale on ne peut pas trouver les deux vitesses résultantes (4 equations 3 inconnues scalaires). Il faut une derniere information (par exemple on sait avec quel angle repart une des deux billes ...).


Oui, c'est juste mais...tu disposes d'une autre information !

Si tu veux tenir compte des frottements, tu connais alors l'angle avec la droite des centres du vecteur impulsion d'une bille sur l'autre,

Si tu ne veux pas tenir compte des frottements, tu connais alors l'angle avec la droite des centres du vecteur impulsion d'une bille sur l'autre - dans ce cas, cet angle est nul !

J'ai fait il y a quelques années une simulation de boules sur un billard : si je me souviens bien, il ne manquait aucune équation...

vinch
Membre Naturel
Messages: 50
Enregistré le: 20 Juin 2007, 21:04

par vinch » 24 Aoû 2007, 09:20

Je ne vois pas ce que tu veux dire par cette derniere information, effectivement on connait tous les angles "avant collision" mais ça n'indique rien sur les angles avec lesquelles repartent les billes ...

Ici on a décidé qu'on travaillait sans frottements pour le moment, sinon on ne pourrait pas appliquer la conservation de l'energie cinétique comme on l'a fait (avec un coefficient de dissipation ça peut se faire apparament)

Si tu es sur de toi pourrais tu nous détailler la résolution de ce problème qui parait pourtant si simple et qui nous bloque ...

Quidam
Membre Complexe
Messages: 3401
Enregistré le: 03 Fév 2006, 16:25

par Quidam » 24 Aoû 2007, 09:45

vinch a écrit:Je ne vois pas ce que tu veux dire par cette derniere information, effectivement on connait tous les angles "avant collision" mais ça n'indique rien sur les angles avec lesquelles repartent les billes ...

Ici on a décidé qu'on travaillait sans frottements pour le moment, sinon on ne pourrait pas appliquer la conservation de l'energie cinétique comme on l'a fait (avec un coefficient de dissipation ça peut se faire apparament)

Si tu es sur de toi pourrais tu nous détailler la résolution de ce problème qui parait pourtant si simple et qui nous bloque ...

Je vais voir ce que je peux faire, car je n'ai guère de temps ces jours-ci !

J'ai parlé du vecteur "impulsion" : il s'agit de l'intégrale :
pendant la fraction de seconde que dure le choc. La conservation de la quantité de mouvement indique que la somme vectorielle de la quantité de mouvement de la première bille et de celle de la deuxième AVANT le choc est forcément égale à la somme vectorielle de la quantité de mouvement de la première bille et de celle de la deuxième APRES le choc. Par contre la quantité de mouvement de la bille 1 varie au cours du choc, et celle de la bille 2 également : c'est la somme des deux qui ne varie pas. La différence entre la quantité de mouvement de la bille 1 apres le choc et la quantité de mouvement de la bille 1 avant le choc est l'impulsion fournie par la bille 2 à la bille 1 ; elle est exactement opposée à l'impulsion fournie par la bille 1 à la bille 2, et la somme vectorielle des deux quantités de mouvement, elle, ne change pas. Or l'impulsion est un vecteur, intégrale du produit d'une force (un vecteur) par le temps. Et s'il n'y a pas de frottement, la force en question - certainement très variable pendant la milliseconde du choc, est en tous cas fixe en direction : sa direction est donnée par la droite qui joint les centres des deux boules. Par conséquent, cela nous donne comme information supplémentaire le fait que la variation de quantité de mouvement de la boule 1 (opposée à celle de la boule 2) a pour direction la droite des centres...

Pour l'instant, c'est tout ce que je peux donner comme explications...Je n'ai pas assez de temps !

nouknouk
Messages: 8
Enregistré le: 22 Aoû 2007, 18:54

par nouknouk » 24 Aoû 2007, 09:57

Quidam a écrit:Pour l'instant, c'est tout ce que je peux donner comme explications...Je n'ai pas assez de temps !

C'est déjà beaucoup :we:
Merci à toi et à tous ceux qui prennent sur leur temps pour alimenter la discussion...

Quidam a écrit:sa direction est donnée par la droite qui joint les centres des deux boules.

Effectivement, en ignorant les frottements, et comme l'unique point de contact est parfaitement aligné avec les centres de gravité des deux boules, intuitivement, c comme ça que j'ai implémenté ma première version.

 

Retourner vers ⚛ Physique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite