graphix | 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 :
- import Physics.Vector;
- class Physics.Particule {
- public var curr;
- public var prev;
- private var temp;
- var coeff = 1;
- var gravity;
- var initialForce;
- public function Particule (posX:Number, posY:Number) {
- // positions :
- curr = new Vector (posX, posY);
- prev = new Vector (posX, posY);
- temp = new Vector (0, 0);
- gravity = new Vector (0, .81);
- }
- public function Initialise () {
- var f = gravity.plus (initialForce);
- curr = curr.plus (f);
- }
- public function verlet () {
- temp.x = curr.x;
- temp.y = curr.y;
- curr.x += coeff*(curr.x-prev.x)+gravity.x;
- curr.y += coeff*(curr.y-prev.y)+gravity.y;
- prev.x = temp.x;
- prev.y = temp.y;
- }
- private function degToRad (a:Number) {
- var aRad = (a/180)*Math.PI;
- return aRad;
- }
- private function setInitialForce (a:Number, l:Number) {
- var a = degToRad (a);
- var Vx = l*Math.cos (a);
- var Vy = l*Math.sin (a);
- initialForce = new Vector (Vx, Vy);
- }
- public function bounce () {
- if (curr.y>500) {
- var normal:Vector=new Vector(0,-1)
- var vitesse:Vector=curr.minus(prev)
- var sDotV:Number = normal.dot(vitesse);
- var velProjection:Vector = vitesse.minus(normal.cross(sDotV));
- var perpMomentum:Vector = velProjection.cross(0);
- var normMomentum:Vector = normal.cross(sDotV * 2);
- var totalMomentum:Vector = normMomentum.plus(perpMomentum);
- var newVel:Vector = vitesse.minus(totalMomentum);
- curr.y = 500;
- prev = curr.minus (newVel);
- }
- }
- }
|
|