Accueil > Forum > > > > Collision elastique indirecte ?
Collision elastique indirecte ?
samedi 17 juin 2006 à 18:29:40 |
Collision elastique indirecte ?

SnOOpss
|
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 ??
|
|
samedi 17 juin 2006 à 19:06:58 |
Re : Collision elastique indirecte ?

JCDjcd
|
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.aspxC'est quoi un choc elastique "indirect" ?? JCDjcd Pourquoi faire simple quand on peut faire compliqué ?
|
|
samedi 17 juin 2006 à 20:04:02 |
Re : Collision elastique indirecte ?

SnOOpss
|
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)
|
|
samedi 17 juin 2006 à 20:26:38 |
Re : Collision elastique indirecte ?

SnOOpss
|
Sinon je viens de regarder ton explication pour ton billard
[quote]
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)
[/quote]
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).
|
|
samedi 17 juin 2006 à 20:45:06 |
Re : Collision elastique indirecte ?

JCDjcd
|
tu pourrais preciser ce que signifie <globule> <i> <glob> <dxtang> ... Ou est-ce-que tu calcules le centre de gravite ?
Pourquoi faire simple quand on peut faire compliqué ?
|
|
samedi 17 juin 2006 à 21:41:32 |
Re : Collision elastique indirecte ?

SnOOpss
|
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.
|
|
dimanche 18 juin 2006 à 11:48:23 |
Re : Collision elastique indirecte ?

SnOOpss
|
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)
|
|
dimanche 18 juin 2006 à 12:54:43 |
Re : Collision elastique indirecte ?

JCDjcd
|
Réponse acceptée !
//*********************************************** 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é ?
|
|
dimanche 18 juin 2006 à 15:35:18 |
Re : Collision elastique indirecte ?

SnOOpss
|
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.
|
|
Cette discussion est classée dans : double, dx2, dy2, pdx1, pdy1
Répondre à ce message
Sujets en rapport avec ce message
long double et VC++ [ par omi ]
J'ai un leger probleme avec visual C++ 7.0 .N'y a t'il pas un moyen de lui faire accepter les long double car il les prend pour des double normaux cad
Affichage décimal [ par couriousous ]
Hello!Comment afficher une variable long double avec toutes ses décimales SANS la convertire au format double (perte de précision)???Merci!
CONVERSION DOUBLE CHAR [ par DeAtHCrAsH ]
Salut,J'ai un ptit pb... Je suis debutant et j'ai un ptit prob...Je veux utiliser la fonction atof mais quand je compile ca me dit : undeclared identi
conversion double en string [ par bouba ]
Bonjour, je réalise une fonction qui doit calculer le nombre de caractères d'un doubleexemple:-7.56 -> 5 caractèreExiste t'il une fonction qui fasse c
PB valeur maximale variables [ par chmod777 ]
voila, j'ai une boucle for qui doit se terminer lorsque la variable compteur atteint 208.827.064.576 le probleme c'est qu'avec une variable de type in
double pointeur, récursivité dans les arbres binaires ordonnés [ par alfred289 ]
float-->char* ou double-->char* [ par tavernier ]
Help !Comment puis-je faire pour transformer mon float, ou mon double en char * ?Merci d'avanceJulien (Militant 4NT! M!Cr0$0FT depuis toujours!)
double --> char[] [ par coockiesch ]
Hello.Je cherche à passer un double dans une chaine de caractères. J'au utilisé "sprintf(char[], "%f", double)" mais elle ne revoie pas toutes les déc
c++ : pb avec une fonction extern C [ par nanch07 ]
J'expose tout, voilà: dans une de mes classes je fais appel à une fonction externe en C ( de numerical recipes in C). Mais j'ai également besoin de ce
Definition de fonction pendant l'execution [ par progueur ]
Bonsoir,Je suis en train de faire un programme de calcul sur des fonctions mathematiques.Et j'aimerais que l'utilisateur puisse entrer sa fonction de
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|