IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flash Discussion :

Box2D et rebonds parasites


Sujet :

Flash

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 47
    Points
    47
    Par défaut Box2D et rebonds parasites
    Bonjour à tous,

    Je me suis lancé depuis peu dans le développement d'applications flash utilisant l'excellent moteur physique 2D Box2D. Je suis malheureusement confronté à un soucis que d'autres ont dûrencontrer mais auquel je ne trouve pas de solution malgré un épluchage de la doc et même du code source des classes de Box2D.

    Je m'explique :

    Je laisse tomber un objet statique sur une surface identifiée sur le sol. L'objet a un coefficient de rebond de 0.75 et un coefficient de friction de 1 (afin d'éviter toute friction). Cet objet rebondit, et de moins en moins haut car en perte de vitesse évidente, ce qui est normal... le problème c'est que cet objet ne s'arrête jamais au sol, il continue de faire des micros bonds à chaque contact avec le sol.

    Je pense que la solution viendra plutôt de quelqu'un ayant déjà rencontré ce problème. Je peut poster le code source mais je pense qu'elle n'est d'aucune utilitée.

    Bonne journée,

    Smiff.

  2. #2
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    salut

    évite la friction a 1, vise plutôt 0.98 ou moins ... mais normalement si tu as bien configuré les "vecteurs de gravité" ce problème ne devrait pas arriver.

    allowsleep est bien a true ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    Merci pour ta réponse, malheureusement ça ne change rien. Je vais quand même joindre le code, ça sera peut-être plus évident pour voir où peut être le problème.

    Voilà mon code de création des objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    var bodyDef:b2BodyDef = new b2BodyDef();
    bodyDef.position.Set((element.x/toUnit), (element.y/toUnit));
    bodyDef.allowSleep = true;
     
    var body:b2Body = world.CreateBody(bodyDef);
     
    var shapeDef:b2PolygonDef = new b2PolygonDef();
    shapeDef.SetAsBox((element.width/2/toUnit), (element.height/2/toUnit));
    shapeDef.density = 25;
    shapeDef.friction = 0.5;
    shapeDef.restitution = 0.5;
     
    body.CreateShape(shapeDef);
    body.SetMassFromShapes();
    Concernant le sol il n'a aucune restitution, donc il ne devrait pas poser de problème.

    Code pour le vecteur de gravité (et la définition du "monde") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var worldAABB:b2AABB = new b2AABB();
    worldAABB.lowerBound.Set(-100, -100);
    worldAABB.upperBound.Set(100, 100);
    var gravity:b2Vec2 = new b2Vec2(0.0, 500.0);
    var doSleep:Boolean = true;
    var world:b2World = new b2World(worldAABB, gravity, doSleep);
    Donc en gros j'ai l'impression que mon code est pas mal... le problème vient peut-être à cause de ma gravité trop élevée... je l'ai baissée à 50 mais ça ne change rien.

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    je vois rien qui me parait anormal, tu fais ton monde sur une echelle de combien ?
    car dans la DOC de B2D ils disent qu'il ne doit pas dépasser 10 unités de larg/haut (adaptation C++), faut donc des multiplicateurs de 80 a 100x.
    au début j'ai essayé de mettre le monde en taille réeel (800x600) et j'ai eu des résultats trés bizarre et une performance ridicule

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    Mon multiplicateur est de 30. Je suis sur un monde de 1600 X 1200 pixels, donc comme dans la doc ils préconisent le double en taille j'ai adapté à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    worldAABB.lowerBound.Set(-stage.width / 30, -stage.height / 30);
    worldAABB.upperBound.Set(stage.width*2/30, stage.height*2/30);
    Mais ça ne change rien...

  6. #6
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    x30 pour 1600/1200 ??
    la il y a une erreur, ton monde pour B2D ne doit pas dépasser 10 unités (pixel) il te faut donc un multiplicateur de 160 pour les largeurs et 120 pour les hauteurs

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    Y a donc un truc que j'ai pas pigé dans le manuel...

    "Box2D is tuned for MKS units. Keep the size of moving objects roughly between 0.1 and 10 meters. You'll need to use some scaling system when you render your environment and actors. The Box2D examples do this by using an OpenGL viewport transform."

    Donc effectivement, si je comprends, bien mes "paramètres de taille" ne doivent pas dépasser 10 donc j'ai rectifié mon code en changeant les unités avec un multiplicateur de 160.

    Ca n'a rien changé, par contre l'idée est bonne et par ce biais j'ai trouvé la solution : c'est ma gravité, beaucoup trop élevée... 32.50 semble être la limite pour mon monde...

    Merci pour ton aide,

    Bonne soirée,

    Smiff.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rebond simple d'une balle
    Par Fiquet dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 11/10/2005, 16h48
  2. Réponses: 2
    Dernier message: 05/08/2005, 09h21
  3. rebond balle plan
    Par Mat 74 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 30/05/2005, 22h41
  4. Affichage parasite sous Firefox
    Par Steph4fun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 04/02/2005, 15h05
  5. [java.util.logging] trop d'info parasite....
    Par zolive dans le forum Logging
    Réponses: 2
    Dernier message: 25/05/2004, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo