Rebond d'une balle sur un mur ...

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

14 réponses

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

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+
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
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
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006

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

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

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 ;) ...
Messages postés
459
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
1
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
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006

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 ...
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
35
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
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
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 ]
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
35
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
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
3
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 ]
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
35
ah pardon Kenavo,
c'est moi qui avait rien compris alors
désolé pour ce poste inutile

@+
Cirec
Messages postés
19
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2006

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 !