Collision elastique indirecte ?

Résolu
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 17 juin 2006 à 18:29
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre 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 ??

8 réponses

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
18 juin 2006 à 12:54
//***********************************************
      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é ?
3
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
17 juin 2006 à 19:06
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é ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 juin 2006 à 20:04
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)
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 juin 2006 à 20:26
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).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
17 juin 2006 à 20:45
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é ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
17 juin 2006 à 21:41
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
18 juin 2006 à 11:48
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)
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
18 juin 2006 à 15:35
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.
0
Rejoignez-nous