recherche algo balistique (bonus : jeux inside ! )

recherche algo balistique (bonus : jeux inside ! ) - C++ - Programmation

Marsh Posté le 05-01-2003 à 04:25:30    

salut,
 
j'ai les constantes gravité, vent, masse de l'objet.
le vent est toujours parallele au sol, positif ou  
negatif.
 
mon but ultime est d'avoir une fonction du type :  
 
je lui transmet l'adresse d'une structure en entrée avec x, y, angle, velocité  
ainsi qu'un timecode T.
 
la fonction me retourne un pointeur sur une structure contenant x,y,angle, velocité qu'aurra l'objet au timecode T.
 
a force de googliser j'ai reussi a trouver un algo qui pourrais me convenir, mais il ne contient pas la notion du vent.
je n'ai pas les competence en physique/mathematique pour modifier son algo.
 
si qq'un a vu un  truc comme ca trainer qqpart (et GPL :)
 
merci


Message édité par nico168 le 05-01-2003 à 14:17:36
Reply

Marsh Posté le 05-01-2003 à 04:25:30   

Reply

Marsh Posté le 05-01-2003 à 04:39:34    

Il faut resoudre l'equation différentiel du mouvement et ensuite tu implemente ca dans le langage que tu veux.
 
En gros tu resous
 
F1+F2+...+Fi = m.a = m.dV/dT = m.d²OM/dT²
 
[F1..Fi] etant l'expresion vectoriel des forces que subissent ton objet plus ya de force que tu prendra en compte plus la solution sera complexe.
 
m c la masse
V la vitesse
OM ton vecteur position cad le resultat que tu cherche
T le temps
 
Pour un truc simple tu peux prendre en compte comme force la pasenteur et la resistance de l'aire ca te donne une equation du type:
 
g  - k.V/m = d²V/dT²
<=>
k.V/m + d²V/dT² = -g
 
ou k est le coeficient de frotement.
 
c une equation différentielle du second ordre avec second membre ya plus qu'à resoudre et t'aura t'as fonction de OM(T) cad f(t)->(x,y,z)

Reply

Marsh Posté le 05-01-2003 à 10:36:12    

mauvaise cat :pfff:

Reply

Marsh Posté le 05-01-2003 à 10:51:59    

Pour le vent en fonction de la vitesse (en fait du nombre de Reynolds) ça sera une force en V ou en V²

Reply

Marsh Posté le 05-01-2003 à 14:03:07    

houla....
 
je capte rien a se que je vous me raconter...  
comme je le disais plus haut, je suis pas trop calé en math. je ne  sais meme pas se qu'est une equation differentielles... alors pour se qui est de la resoudre...
 
soit l'algo suivant qui fait a eu pres se que je veux:
 

Code :
  1. double g=-8, pi=3.141593, c=0.001; // define simulation constants -8 0.002
  2. double fnf(double p, double q) {
  3.           return -c*p*sqrt(p*p+q*q);
  4. }
  5. double fng(double p, double q) {
  6.  return -c*q*sqrt(p*p+q*q)-g;
  7. }
  8.          /////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. int ComputeBalistic( BalisticType *balistic )
  10. {
  11. #ifdef DEBUG_FONCNAME
  12. fprintf(stderr,"ComputeBalistic\n" );
  13. #endif
  14.   double t=0; // start time
  15.   double x=balistic->Start.X; // initial position
  16.   double y=balistic->Start.Y;
  17.   double v=balistic->Start.Velocity; // initial velocity
  18.   double a=balistic->Start.Angle; // fireing angle
  19.   double h=balistic->StepSize; // step size
  20.   double f1,g1,f2,g2,f3,g3,f4,g4,dp,dq,p,q;
  21.   int n;
  22.   BalisticDoubleRowType tmpRow;
  23.   BalisticIntRowType lastRow;
  24.   char truc[250];
  25.   lastRow.X=0;
  26.   lastRow.Y=0;
  27.   a=pi*a/180; // convert angle to rad
  28.   p=v*cos(a); // calc vert & horis. speeds.
  29.   q=v*sin(a);
  30.   for(n=1; n<=500000; n++)
  31. {
  32. f1=fnf(p,q);
  33. g1=fng(p,q);
  34. f2=fnf(p+h*f1/2, q+h*g1/2);
  35. g2=fng(p+h*f1/2, q+h*g1/2);
  36. f3=fnf(p+h*f2/2, q+h*g2/2);
  37. g3=fng(p+h*f2/2, q+h*g2/2);
  38. f4=fnf(p+h*f3, q+h*g3);
  39. g4=fng(p+h*f3, q+h*g3);
  40. dp=(f1+2*(f2+f3)+f4)/6;
  41. dq=(g1+2*(g2+g3)+g4)/6;
  42. x+=p*h+0.5*dp*h*h; // three-term-Taylor approximation
  43. y+=q*h+0.5*dq*h*h;
  44. p+=dp*h; q+=dq*h; t+=h;
  45. if((lastRow.X!=(int)x)||(lastRow.Y!=(int)y)) //if it is drawn in another pixel
  46.  {
  47.  //fprintf(stderr,"added------------------" );
  48.  tmpRow.Timecode=t;
  49.  tmpRow.X=x;
  50.  tmpRow.Y=y;
  51.  tmpRow.Velocity=sqrt(p*p+q*q);
  52.  tmpRow.Angle=180*atan(q/p)/pi;
  53.  AddRowInBalistic(balistic, tmpRow);
  54.  lastRow.X=(int)x;
  55.  lastRow.Y=(int)y;
  56.  if( (IsFieldEmpty((int)x,(int)y)==0) ||((int)y>YReferenceSize)) //if new pixel is not empty
  57.   {
  58.   balistic->Impact.Timecode=h;
  59.   balistic->Impact.X=x;
  60.   balistic->Impact.Y=y;
  61.   balistic->Impact.Velocity=tmpRow.Velocity;
  62.   balistic->Impact.Angle=tmpRow.Angle;
  63.   break;
  64.   }
  65.  }
  66. }
  67.   balistic->IsComputed=1;
  68.   return 1;
  69. }


 
jeux : lui rajouter la notion du  vent  :)


Message édité par nico168 le 05-01-2003 à 14:52:25
Reply

Marsh Posté le 05-01-2003 à 14:34:58    

Faut voir si c'est réellement pertinent avec le modèle que tu utilises.
Déjà la vitesse initiale d'un obus c'est typiquement 500 m/s pour un obus de canon de 155mm et plus de 1000m/s pour un obus antichar de 120mm.
 
Alors un petit vent de 50km/h (=13.9m/s) va pas vraiment modifier grand chose.
 
Et si tu recherches la précision (disons 50m pour une cible à 20km), il faudra aussi tenir compte des caractéristiques (pression, température) des couches atmosphériques traversées car l'obus va monter assez haut.


Message édité par verdoux le 05-01-2003 à 14:35:22
Reply

Marsh Posté le 05-01-2003 à 14:44:21    

je ne cherche pas vraiment une precision.
tout ca c'est pour un jeux.
tu connais le jeux worms ?
tu deplace un petit personnage, tu choisis une arme, tu lui donne un angle de tir, une force, et tu tire.
tout ca se passe en 2d.
il peut y avoir du vent, par exemple si tu tire a 45° aux bazooka et qu'il y a un fort vent contraire, il peut te revenir dessus.
 
bref..j'utilise l'algo si dessus, tout marche bien...mais y'a pas de vent.
 
moi je verrais bien le vent comme :
il n'agit que sur le position X (parallele au sol)
 X=X+(timecode actuel-timecode de depart)*vent.
il serais donc exprimé en pixel par unité de timecode ?
mais je ne sais pas si c'est correct et comment l'ajouter dans l'algo


Message édité par nico168 le 05-01-2003 à 14:57:37
Reply

Marsh Posté le 06-01-2003 à 00:29:29    

Citation :

moi je verrais bien le vent comme :
il n'agit que sur le position X (parallele au sol)
 X=X+(timecode actuel-timecode de depart)*vent.
il serais donc exprimé en pixel par unité de timecode ?
mais je ne sais pas si c'est correct et comment l'ajouter dans l'algo


 
non ce n'est pas correct.  
Dans ton equation, tu as simplement vitesse de ton objet = vent
ce qui est correct quand il n'est soumis a aucune autre force
or ton objet a une vitesse propre est soumis a la gravite et il avance contre ou dans le vent.
 
j'ecrirais quelque chose comme:
 
x = x + vx * dt;
y = y + vy * dt;
vx = vx + f * (vvx-vx) * dt;
vy = vy - (f * vy + g) * dt;
 
avec f la force du vent rapportee a la masse
de ton objet (un objet dans une matiere legere subira
fortement l'influence du vent, contrairement a un objet
dans une matiere lourde). Ca depend aussi de l'aerodynamisme
et de l'angle d'attaque de l'objet dans l'air (qui influera egalement sur son moment mais on laisse tomber ca pour l'instant)
 
g est la gravite, c'est une constante si tu parcours de petites distances et elle vaut 9.81 m/(s*s)
 
dt est le temps qui s'ecoule entre deux calculs successifs de position, plus il est petit plus le calcul est precis. Le probleme avec cette methode c'est que pour arriver a l'instant T, il faut calculer une floppee de positions successives avant ce point.
 
Si tu ne veux pas faire ca ET si la vitesse du vent est une constante. Tu as la formule qui te donne la position directement en fonction de la date et qui decoule directement de l'equation differentielle mais.. le resultat est particulierement lourd
et fait intervenir des exponentielles si tu te contentes d'une force du vent dependant lineairement de la vitesse..
Je posterais la formule si besoin est..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 07-01-2003 à 12:20:56    

merci pour vos reponses,
 

Citation :

non ce n'est pas correct.  
Dans ton equation, tu as simplement vitesse de ton objet = vent


 
je me suis mal exprimé...dans mon equation...je supposais que X etait deja la position calculé pour le timecode actuel, je n'ai donc plus qu'a lui ajout l'action du vent. je vais donc reformuler :
X1= position X au timecode demandé sans l'action du vent
X2= position X au timecode demandé avec l'action du vent
Vent= exprimé en unité de distance/unité de timecode
sachant que X1 est calculé par l'algo plus haut, je pensais que :
 X2=X1+(timecode actuel-timecode de depart)*vent
 
j'ai d'ailleur trouver ca sur le net :
 

Citation :

To take into account wind drag, add to the horizontal distance moved a small extra distance term proportional to the wind speed at each time step.  Not quite physically realistic, but good enough I expect.


Message édité par nico168 le 07-01-2003 à 12:21:14
Reply

Marsh Posté le 07-01-2003 à 14:13:36    

nico168 a écrit :

tu connais le jeux worms ?

:love:  :love:  :love:


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 07-01-2003 à 14:13:36   

Reply

Marsh Posté le 07-01-2003 à 15:16:09    

bon..j'ai mis une version windows pre-alpha de mon projets ici
 
 
http://c500.dyndns.org/test.zip (147ko)
 
les touches gauche et droite pour deplacer
les touches haut et bas pour modifier l'angle
les touches page up page down pour changer la velocité
la touche tab pour previsualiser le tir
la touche espace pour tirer (marche pas encore :) )  
 
comme vous pourrez le constater...j'ai des petits pb avec le calcul des rebonds mais je desespere pas.
 
si ca peut vous permettre de mieux comprendre le pb.
 
je suis ouvert a tous conseils/remarques.


Message édité par nico168 le 07-01-2003 à 16:33:30
Reply

Marsh Posté le 07-01-2003 à 17:36:24    

bon...je vois que mon projets a attiré des foules...
 
(p'ti up déguisé)

Reply

Marsh Posté le 07-01-2003 à 18:17:50    

Citation :

To take into account wind drag, add to the horizontal distance moved a small extra distance term proportional to the wind speed at each time step.  Not quite physically realistic, but good enough I expect.


 
ah ben si tu t'en fiches que ce soit physiquement correct
tu fais ce que tu veux effectivement :sweat:
 
Enfin le type qui a ecrit ca il ne s'est vraiment pas fatigue..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 07-01-2003 à 18:47:38    

C klr que Worms c pas le summon du réalisme ;) Moi qd j'ai vue que tu demandais une equation de ballistique je pensais que ct pour faire un trucs sérieux [:zaib3k]

Reply

Marsh Posté le 07-01-2003 à 20:32:17    

nico168 a écrit :

bon..j'ai mis une version windows pre-alpha de mon projets ici
 
 
http://c500.dyndns.org/test.zip (147ko)
 
les touches gauche et droite pour deplacer
les touches haut et bas pour modifier l'angle
les touches page up page down pour changer la velocité
la touche tab pour previsualiser le tir
la touche espace pour tirer (marche pas encore :) )  
 
comme vous pourrez le constater...j'ai des petits pb avec le calcul des rebonds mais je desespere pas.
 
si ca peut vous permettre de mieux comprendre le pb.
 
je suis ouvert a tous conseils/remarques.


oups... les touches haut bas gauche droite ne font rien chez moi... sinon, ça commence pas mal...


---------------
Tout cul tendu mérite son dû
Reply

Marsh Posté le 08-01-2003 à 00:46:31    

ouai mais bon, d'un autre coté, si les touches haut/bas/gauche/droite ne marchaient pas, tu n'as pas du voir grand choses :)
 
je comprends pas pourquoi, ca marche pas chez toi.  2 potes  l'ont testé et ils n'ont pas ce pb.

Reply

Marsh Posté le 08-01-2003 à 03:09:15    

BeTtASpLeNdEnS a écrit :


oups... les touches haut bas gauche droite ne font rien chez moi... sinon, ça commence pas mal...


 
+1

Reply

Marsh Posté le 08-01-2003 à 11:32:17    


 
 
tu veux dire que toi aussi les touches de directions ne marche pas ?

Reply

Marsh Posté le 08-01-2003 à 12:47:36    

nico168 a écrit :


 
 
tu veux dire que toi aussi les touches de directions ne marche pas ?


 
bah oué

Reply

Marsh Posté le 08-01-2003 à 13:41:44    

et perso, j'ai essayé les touches standard.. et aussi en passant par le pavé numérique (activé comme déséactivé)
 
bah.. j'sais pas trop d'où ça vient ton pb là faudrait essayer de définir d'autres touches pour voir peut etre si c plus un code page pas pareil qui pourrait faire ça ou pas...


---------------
Tout cul tendu mérite son dû
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed