Collision elastique indirecte ? [Résolu]

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
- - Dernière réponse : SnOOpss
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
- 18 juin 2006 à 15:35
Bonjour

Je suis toujours a essayer de rendre mon jeu realiste (meme principe
que le billard) et j'ai essayé pas mal de methodes sans jamais trouver
la bonne.


La j utilise la fonction suivante (non optimisé mais je suis en train de la bricoler)


void VecteurRebond(double *pdx1, double *pdy1 ,double dx2 ,double dy2) {

   

    double dx1 = *pdx1;

    double dy1 = *pdy1;


    double mod = hypot(dx2,dy2);

    dx2 = dx2/mod;

    dy2 = dy2/mod;


    double scalaire = (dx1)*(dx2)+(dy1)*(dy2);

    double dx=dx1 - 2 * scalaire * dx2;

    double dy=dy1 - 2 * scalaire * dy2;


    *pdx1 = dx;

    *pdy1 = dy;


}


Qui marche nickel pour les angles des rebonds mais absolument pas pour
les forces. Si une boule en mouvement rentre dans une boule fixe, la
premiere s arrette et c'est la seconde qui repart. Donc j'ai trouvé la
formule suivante

V1'=((M-1)V1)/(M+1)

V2'=(2*M*V2)/(M+1)

avec M=m1/m2


Mais celle ci ne marche que pour les collisions directes, les vecteurs
sont alignés et les centres des boules aussi. Si les boules se cognent
a peine (sur un bord) cette fonction est fausse.


Quelqu'un aurait une piste pour orienter mes recherches ??
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Dernière intervention
25 janvier 2009
3
Merci
//***********************************************
      P_BALL  B1,B2;
      VECT2D  u,v; // base locale, u dirige selon les centres des deux boules et v l'orthogonal
      double  u1,u2,uG,v1,v2;


      B1            = crash->data.between.B1;
      B2            = crash->data.between.B2;


      SubVect2D(&u,&B1->p0,&B2->p0);
      UnitVect2D(&u,&u);
      v.x = -u.y;
      v.y = +u.x;


      u1 = DotProductVect2D(&B1->v,&u);
      u2 = DotProductVect2D(&B2->v,&u);
      v1 = DotProductVect2D(&B1->v,&v);
      v2 = DotProductVect2D(&B2->v,&v);


      uG = (B1->m*u1 + B2->m*u2)/(B1->m + B2->m);
      u1 = 2*uG - u1;
      u2 = 2*uG - u2;


      LinCombinVect2D(&B1->v,&u,&v,u1,v1);
      LinCombinVect2D(&B2->v,&u,&v,u2,v2);
//***********************************************
en fait tu n'as besoin que de la composante X du vecteur vitesse vG (l'axe des X etant la droite passant par les deux centres)
regarde la ligne "uG = ..."

Pourquoi faire simple quand on peut faire compliqué ?

Merci cs_JCDjcd 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Dernière intervention
25 janvier 2009
0
Merci
Si tu veux simuler les chocs elastiques, alors c'est "normal" que si une boule initialement au repos se prend une boule a pleine vitesse, alors elle va prendre cette vitesse, et l'autre boule va s'arreter ! c'est tout a fait physique (c'est le celebre jeu des tic tac ou il y a 5 billes supendues a des files, puis en ecartant une on s'apercoit que lorqu'elle retombe, seule la bille oppose remonte ...)

cf http://www.cppfrance.com/codes/SIMULATION-BILLARD_33545.aspx

C'est quoi un choc elastique "indirect" ??

JCDjcd
Pourquoi faire simple quand on peut faire compliqué ?
Commenter la réponse de cs_JCDjcd
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
0
Merci
Ben en fait si le choc est direct 100/100 de l(energie est transférée
donc la premiere s'arrette et la seconde part a la vitesse de la
premiere c'est l'exemple du tictac.

Dans l'autre cas la droite passant par le centre des deux boules n'est
pas dans le meme sens que les 2 forces et donc seule une partie est
transferée.

Si une boule de billard touche une autre boule sur un coté les deux
rebondissent et la ou je m'apercoit que les formules sont fausses (ou
plutot valable dans un cas trop precis)
Commenter la réponse de SnOOpss
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
0
Merci
Sinon je viens de regarder ton explication pour ton billard



On se place dans le repere (u,v) avec u unitaire et dirige selon les
deux centres des boules, et v l'orthogonal direct et unitaire de u.


vA(apres) = 2.vG - vA(avant)

vB(apres) = 2.vG - vB(avant)



Je suis pas sur de moi mais je fait presque pareil.


                dxtang = globule[glob].x - globule[i].x;

                dytang = globule[glob].y - globule[i].y;

           
    VecteurRebond(&globule[glob].dx,
&globule[glob].dy ,dxtang ,dytang);


en fait j 'envoi a ma fonction les information sur le 1 er vecteurs (dx
et dy), la fonction me normalise le vecteur passant par le centre des
deux boules et me retourne le nouveau vecteur V1.


Apres je fait ca


                dxtang = globule[i].x - globule[glob].x;

                dytang = globule[i].y - globule[glob].y;

           
    VecteurRebond(&globule[i].dx, &globule[i].dy
,dxtang ,dytang);


pour le second vecteur mais ca ne marche que pour un choc entre un
objet mobile et un autre immobile sachant que apres le premier rebondi
et la seconde boule ne bouge pas (comme globule[i].dx et globule[i].dy
sont nuls).
Commenter la réponse de SnOOpss
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Dernière intervention
25 janvier 2009
0
Merci
tu pourrais preciser ce que signifie <globule> <glob> <dxtang> ...
Ou est-ce-que tu calcules le centre de gravite ?

Pourquoi faire simple quand on peut faire compliqué ?
Commenter la réponse de cs_JCDjcd
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
0
Merci
Ben en fait mes "boules" sont stochées dans des tableaux Globules

Globule[2] = 2 eme globule


dxtang = globule[glob].x - globule[i].x;

dytang = globule[glob].y - globule[i].y;


En fait dxtang corespond a la distance suivant x entre le centre de la
boule Globule[i] et globule[glob] (sachant que globule[glob] correspond
au globule que le prog est en train de gerer). En fait il fait les
calculs pour chaque globule (glob prends toute les valeur de 1 a 6)
avec tout les globules (i passe de 0 a 6 globule) avec une magouille
pour eviter qu'il calcule 2 fois le meme (une fois quand il touche et
quand il est touché).


En fait pour mes rebonds je bosse avec

le Vecteur Vitesse (et direction vu que c'est un vecteur) de la boule traité globule[glob].dx et globule[glob].dy

Le point de la boule traité globule[glob].x et globule[glob].y


les Vecteurs Vitesses des autres boules globule[i].dx et globule[i].dy


Les point des boules traitées globule[i].x et globule[i].y

Pour i allant de 0 a 6.


Tout est en temps reel par contre contrairement au billard.
Commenter la réponse de SnOOpss
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
0
Merci
J'ai regardé ton code et je crois que mon erreur viens bien du calcul du centre de gravité

vA(apres) = 2.vG - vA(avant)

vB(apres) = 2.vG - vB(avant)

Moi pour vG je prend le vecteur normalisé passant par le centre des 2
boules et donc quelque soit le vecteur de la boule 1 les calculs pour
la boule 2 se font juste avec V2 et ce vecteur.


Mais j'arrive pas a comprendre ou tu calcules vG (le code est assez complexe)
Commenter la réponse de SnOOpss
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Dernière intervention
5 décembre 2013
0
Merci
Merci beaucoup ca marche nickel.


Ca fait 2 semaine que je galere sur google a chercher les formules,
j'avais deja vu ta source mais franchement le code est assez lourd et
j'avais laissé tomber. En fait j'ai juste recupéré les fonctions utiles
et remplacé les P_BALL pour pouvoir m'y retrouver et ca a marché du
premier coup, j'aurais du faire plus gaffe.

Maintenant j 'aurais plus de respect quand dans un jeu je voit un gars
qui s' est cassé le cul a faire un rendu physique qu'on remarque a
peine.
Commenter la réponse de SnOOpss

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.