cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006
-
11 févr. 2006 à 14:31
cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006
-
15 févr. 2006 à 14:14
Bonjour,
je suis en train de développer un jeu comportant une bille sur un plateau et je me suis pencher sur la question des rebonds. Je cherche (mes recherches étant vaines) un moyen , sachant que je n'est que des mûrs verticaux mais qui peuvent être dans tous les sens, de calculer les nouvelles composantes de ma vitesse pour ainsi créer des rebonds réalistes.
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 11 févr. 2006 à 20:24
Si tu pars du principe que le contact de la bille avec le mur est ponctuel, que le mur est 100% elastique (ta bille s'enfonce pas dedans pour y rester collée, meme infimement), et au prix de grosses simplifications quant a la question du "rouler-sans-glisser / glisser-sans-rouler" (bon bref c'est un petit jeu, pas de la simulation numérique pointute) alors c'est relativement simple:
Alors faudra a chaque instant : calculer la position de ta bille a l'instant d'apres, verifier que le vecteur déplacement entre T et T+1 ne coupe pas un mur, et si c'est bon tu updates la position de ta bille. Si ca coupe un mur ben hop, mathématiquement parlant tu te mets dans le repere du mur, et c'est comme un mirroir qui réfléchit un rayon de lumière : la trajectoire de ta bille apres rebond , c'est son vecteur d'arrivé symétrique par rapport a la perpendiculaire au mur. elle parcours la meme distance que sans mur, mais avec un changement de trajectoire.
Va pas croire que c'est fini, il faut recommencer ( on est toujours entre T et T +1), des fois qu'apres ce premier rebond entre elle rebondisse sur un autre mur.... donc tu n'obtiens la position a T+1 qu'apres avoir tester tout les rebonds susceptibles de se produire entre T et T+1.
Le tout dans un Repeat {-tout le bigntz-} until { ce que tu veux : Energie cinetique = 0 si tu gères les frottements (proportionnels à V ), la bille dans la cible etc etc etc).
DeltaFX, il parle de vitesse pas de position ( :)).
Potate : il faut utiliser le principe de la conservation de l'impulsion (p=mV avec m la vitesse de ta bille et V son vecteur vitesse. Ta bille a tjs le meme poids avant ou apres le rebond donc elle a la meme vitesse avant et après.
Maintenant au niveau de la position si c'est ce que tu veux : au niveau du point d'impact dans le mur, tu traces une droite perpendiculaire au mur qui passe par ce point. Cette droite forme un angle avec la trajectoire (rectiligne) de ta balle. Et bien la nouvelle trajectoire de la balle sera la droite symétrique de la trajectoire avant le rebond avec cet axe perpendiculaire :
cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006 13 févr. 2006 à 13:37
Certes je comprend le principe mais j'ai un peu du mal à trouver l'implementation qui va bien ...
Il y a pour moi plusieurs manières telles qu'une rotation au point d'impact , une symétrie axiale mais je ne voit pas comment les implémenter ... : S
PS: Merci de vos réponses ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006 13 févr. 2006 à 18:48
C'est encore moi, en fait je pense avoir presque résolu mon probléme cependant j'utilise une rotation pour calculer mon nouveau vecteur vitesse mais pas moyen de retrouver les équations permettant de calculer les coordonnées de l'image d'un point par une rotation d'angle et de centre connu :S.
Si quelqu'un a la solution merci de me la faire parvenir ;) ...
cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006 13 févr. 2006 à 18:48
C'est encore moi, en fait je pense avoir presque résolu mon probléme cependant j'utilise une rotation pour calculer mon nouveau vecteur vitesse mais pas moyen de retrouver les équations permettant de calculer les coordonnées de l'image d'un point par une rotation d'angle et de centre connu :S.
Si quelqu'un a la solution merci de me la faire parvenir ;) ...
cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006 13 févr. 2006 à 21:36
Bien jolies tes réponses, d'une part je partage ce compte donc ce n'est pas moi qui ai posé les questions en ce qui concerne l'OpenGl, dont cependant les réponses ne répondent, en somme, pas tellement à l'attente de la question d'où les demandes de précision. Sinon en ce qui concerne mon probléme de trigonométrie, si toute fois tu l'as bien compris, ( peut être que pour toi les mathématiques sont si faciles ) rien ne t'oblige d'y répondre ...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 14 févr. 2006 à 01:05
Salut,
voici un petit exemple qui n'utilise ni la trigo ni la vitesse ni rien d'ailleur mais
qui simule le déplacement d'une balle avec un changement de direction dès qu'il y a contacte avec un bord
c'est très très simpliste mais comme tous le monde à l'air d'être un peut avare sur un bout de code c'est mieux que rien
C'est tellement simpliste que ça se passe de commentaire
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
begin If DLeft and (Balle.Left+Balle.Width < ClientWidth-5) Then Balle.Left: =Balle.Left+5
Else DLeft := False;
If Not DLeft and (Balle.Left > 1) Then Balle.Left: =Balle.Left-5
Else DLeft := True;
If DBottom and (Balle.Top+Balle.Height < ClientHeight -5) Then Balle.Top : = Balle.Top + 5
Else DBottom := False;
If not DBottom and (Balle.Top > 5) Then Balle.Top : = Balle.Top - 5
Else DBottom := True;
end ;
procedure TForm1.FormCreate(Sender: TObject);
begin Doublebuffered : = True;
end;
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 14 févr. 2006 à 12:03
Cirec, j'ai pas dit que c'était une connerie, je trouve ça juste poétique !
C'est jutement si les murs ne sont pas orthogonaux que ça se complique,
à la fois pour les tests de collision et de direction de rebond.
Si :
- alpha est l'angle que fait le mur avec l'axe horizontal,
- DepX et DepY sont les déplacements selon les axes X ett Y de la balle pendant un intervalle de temps Timer1.Interval,
on peut écrire :
procedure TForm1.Timer1Timer(Sender: TObject);
var
X,Y : real;
begin
Balle.Left := round(Balle.Left + DepX) ; // Déplacement en X
Balle.Top : = round(Balle.Top + DepY) ; // Déplacament en Y
if CollisionSurLeMurDAngleAlpha then
begin
X : = DepX * Cos(2*Alpha) + DepY * Sin(2*Alpha); // Matrice de symétrie
Y : = DepX * Sin(2*Alpha) - DepY * Cos(2*Alpha);
DepX:=X; DepY:=Y;
end ;
end;
facile a vérifier avec les murs sur l'axe X (alpha = 0, X est
conservé, Y est inversé) ou les murs sur l'axe Y (alpha = Pi/2, X est
inversé, Y est conservé)
cs_potate
Messages postés19Date d'inscriptionvendredi 18 novembre 2005StatutMembreDernière intervention12 novembre 2006 15 févr. 2006 à 14:14
Merci de vos répones ...
En ce qui concerne ta méthode Kevano je l'avais utilisé mais avec le mauvais angle :X donc grand merci ! L'implémentation faite cela marche bien mieux :). Il ne le reste "plus" qu'à corriger quelques bugs ...
Merci à vous !