Integration de Verlet > besoin d'éclaircissements

Integration de Verlet > besoin d'éclaircissements - Flash/ActionScript - Programmation

Marsh Posté le 19-03-2008 à 17:12:09    

Bonjour à tous,  
je suis tombé récemment sur l'article de thomas jakobsen decryptant quelques peut l'utilisation de l'integration de verlet pour un moteur physique.
 
Comme j'aimes bien me lancer dans des trucs qui me dépassent, j'essai d'appliquer cette methode, ça me permet en meme temps de me perfectionner en poo.
 
Bref, tout ça marche pas trop mal (les fichiers du moteurs flade y sont évidemment pour bcp), mais j'arrive à un résultat bizarre.
 
J'essai de representer une chute libre avec rebond "dans le vide" cad à priori un mouvement infini, or la à chaque rebond ou presque, mon systeme semble perdre de l'énergie. Je n'arrive pas à trouver l'origine de cette perte. Depuis quelques jours que je me documente j'ai vu que cette methode n'etait pas forcément réaliste, mais qu'elle avais pour avantage d'etre rapide et fiable. Est ce que cette perte d'énergie proviens de ce manque de réalisme ou est ce que je ne m'y prend pas de la bonne façon?
 
Voici la class dont je me sert pour les tests :  
(désolé pour les puristes, c'est évidemment à 99% le code du moteur flade mais ça me permet de comprendre comment ça marche)
 

Code :
  1. import Physics.Vector;
  2. class Physics.Particule {
  3. public var curr;
  4. public var prev;
  5. private var temp;
  6. var coeff = 1;
  7. var gravity;
  8. var initialForce;
  9. public function Particule (posX:Number, posY:Number) {
  10.  // positions :
  11.  curr = new Vector (posX, posY);
  12.  prev = new Vector (posX, posY);
  13.  temp = new Vector (0, 0);
  14.  gravity = new Vector (0, .81);
  15. }
  16. public function Initialise () {
  17.  var f = gravity.plus (initialForce);
  18.  curr = curr.plus (f);
  19. }
  20. public function verlet () {
  21.  temp.x = curr.x;
  22.  temp.y = curr.y;
  23.  curr.x += coeff*(curr.x-prev.x)+gravity.x;
  24.  curr.y += coeff*(curr.y-prev.y)+gravity.y;
  25.  prev.x = temp.x;
  26.  prev.y = temp.y;
  27. }
  28. private function degToRad (a:Number) {
  29.  var aRad = (a/180)*Math.PI;
  30.  return aRad;
  31. }
  32. private function setInitialForce (a:Number, l:Number) {
  33.  var a = degToRad (a);
  34.  var Vx = l*Math.cos (a);
  35.  var Vy = l*Math.sin (a);
  36.  initialForce = new Vector (Vx, Vy);
  37. }
  38. public function bounce () {
  39.  if (curr.y>500) {
  40.   var normal:Vector=new Vector(0,-1)
  41.   var vitesse:Vector=curr.minus(prev)
  42.   var sDotV:Number = normal.dot(vitesse);
  43.   var velProjection:Vector = vitesse.minus(normal.cross(sDotV));
  44.   var perpMomentum:Vector = velProjection.cross(0);
  45.   var normMomentum:Vector = normal.cross(sDotV * 2);
  46.   var totalMomentum:Vector = normMomentum.plus(perpMomentum);
  47.   var newVel:Vector = vitesse.minus(totalMomentum);
  48.   curr.y = 500;
  49.   prev = curr.minus (newVel);
  50.  }
  51. }
  52. }

Reply

Marsh Posté le 19-03-2008 à 17:12:09   

Reply

Marsh Posté le 19-03-2008 à 19:24:07    

Ton code à l'air ok, c'est probablement les arrondis de Flash qui te font perdre de l'enérgie, sachant que là tu es sur des petites valeurs.

Reply

Marsh Posté le 19-03-2008 à 23:34:06    

En effet c'est bien la gravité qui fait déconner le tout, bizarrement des que je met des virgules dans les vecteurs forces, tout deviens instable.
 
Merci d'avoir pris le temps de jeter un oeil !
 
Pour ceux que ca interesse, j'ai ommis de mettre le lien de l'article dont je suis parti : http://teknikus.dk/tj/gdc2001.htm
 

Reply

Sujets relatifs:

Leave a Replay

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