Rebond d'une balle sur un mur ...

Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006
- - Dernière réponse : cs_potate
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 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.

J'attend vos réponses ^^
Afficher la suite 

14 réponses

Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
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).

Et Ouala.
Commenter la réponse de DeltaFX
0
Merci
Salut

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 :

- - -
- - -
- - -
- - -
-
-------------- ton mur

J'espère que mon schéma est clair ?

Salut à vous A+
Commenter la réponse de Utilisateur anonyme
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Dis Frankyky vitesse, position et accélération sont liés, que tu le veuilles ou non. C'est sympa de repéter ce que j'ai écris en langage humain
Commenter la réponse de DeltaFX
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006
0
Merci
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 ;)
Commenter la réponse de cs_potate
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006
0
Merci
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 ;) ...
Commenter la réponse de cs_potate
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006
0
Merci
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 ;) ...
Commenter la réponse de cs_potate
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
0
Merci
Euh.... autant c'est un forum delphi d'entraide en delphi sur delphi, autant les bases de la trigo, t'es pas dispensé de t'en souvenir hein....

Bien tenté le morcelage du problème : je poste une question sur la partie OpenGl en esperant qu'une ame charitable va me l'ecriture à ma place,

Je fais de meme pour le moteur physique du problème.....

.... On t'a vu ! :D
Commenter la réponse de DeltaFX
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006
0
Merci
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 ...
Commenter la réponse de cs_potate
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
33
0
Merci
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

unit Unit1;


interface


uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;


type
TForm1 = class(TForm)
Balle: TShape;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;


var
Form1: TForm1;
DLeft : Boolean = True;
DBottom : Boolean = True;


implementation


{$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;


end.

@+
Cirec
Commenter la réponse de Cirec
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
1
0
Merci
Salut,



Moi j'aime bien l'idée de "mûrs verticaux mais qui peuvent être dans tous les sens"

Ken@vo

Code, Code, Codec !

[%3C/body ]
Commenter la réponse de cs_Kenavo
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
33
0
Merci
Kenavo Kenavo,

chuuuuutttt personne n'avait rien remarqué.
en suite c'est pas entièrement faux puisque vu du haut ça pourrait donner quelque chose comme ça :

ils sont tous à la verticale mais sur le plan horizontal ils sont dans tous les sens (pas uniquement à 90°)

@+
Cirec
Commenter la réponse de Cirec
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
1
0
Merci
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é)

Ken@vo

Code, Code, Codec !

[%3C/body ]
Commenter la réponse de cs_Kenavo
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
33
0
Merci
ah pardon Kenavo,
c'est moi qui avait rien compris alors
désolé pour ce poste inutile

@+
Cirec
Commenter la réponse de Cirec
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006
0
Merci
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 !
Commenter la réponse de cs_potate