2010-04-05 8 views
8

Je pense que j'ai configuré Box2d pour avoir une sorte de vitesse maximale pour n'importe quel corps, mais je ne suis pas sûr. J'applique une impulsion comme (100000000, 100000000), et le corps se déplace aussi vite que (100, 100) - ce qui n'est pas si rapide du tout. J'utilise le port CX2 XNA C#.Box2d: Vitesse linéaire maximale possible?

Mon jeu est un 2d top-down.

Voici un code qui peut être pertinent:

private readonly Vector2 GRAVITY = new Vector2(0, 0); 

    public void initializePhysics(ContactReporter contactReporter) 
    { 
     world = new World(GRAVITY, true); 
     IContactListener contactListener = contactReporter; 
     world.ContactListener = contactListener; 
    } 

    public void Update(GameTime gameTime) 
     { 
    // ... 

      worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10); 

    //... 
     } 

Voici quelques exemples de code qui applique l'impulsion:

private void ApplyImpulseFromInput() 
    { 
     Vector2 movementImpulse = new Vector2(); 

     if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f) 
     { 
      movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f) 
     { 
      movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f) 
     { 
      movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f) 
     { 
      movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ; 
     } 

     model.Body.ApplyImpulse(movementImpulse, model.Position); 
    } 

Si Constants.PLAYER_IMPULSE_CONSTANT est partout de 1000f à 1000000000f, le joueur peut se déplacer au plus (-120, -120) à (120, 120). Si la constante est inférieure, comme 1f, le joueur se déplace plus lentement.

Ce code est utilisé pour mettre en place la physique pour tout dans le monde du jeu:

 controller.Model.BodyDef = new BodyDef(); 
     controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static; 
     controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef); 
     controller.Model.Body.SetLinearDamping(10.0f); 

Serait-il possible l'amortissement linéaire? Je l'ai changé de 10.0f à 0, sans effet.

MISE À JOUR: Weirdness avec un amortissement linéaire: Je l'ai fait ces observations sur le corps qui se déplace avec l'appliquer la méthode d'impulsion ci-dessus:

Linear Damping  Max Speed 
0f     120 
10f     120 
50f     120 
55f     90 
60f     0 
70f     0 
100f     0 
100000f    0 

Pourquoi une plage de sensibilité linéaire d'amortissement entre 50f et 60f?

+0

Le code qui applique l'impulsion peut être utile. –

+0

Désolé. Ajouté –

+0

+1 pour neutraliser celui qui a voté. C'est une question légitime. – avpx

Répondre

3

J'ai le même problème avec la version 2.1a J'ai découvert que changer la ligne 128 dans b2Settings.as peut aider. Modifier static public const b2_maxTranslation: Number = 2.0 à un nombre supérieur. sûr que ce n'est pas la bonne façon, mais en ce moment ne sais pas vraiment comment le faire correctement.

+0

wow. c'est bizarre, mais ça l'a corrigé. –

+8

Je viens de rencontrer ce problème aujourd'hui, sauf que j'utilisais la version C++ de Box2D. Les commentaires se lisent comme suit: "La vitesse linéaire maximale d'un corps, cette limite est très grande et est utilisée pour éviter les problèmes numériques.Vous ne devriez pas avoir besoin de l'ajuster."Ma simulation a été réglée sur 1 pixel égal à 1 unité Box2D J'ai eu le même problème avec le plafonnement de la vélocité .. On dirait que Box2D aime que vous gardiez votre simulation à une plus petite échelle – don

+0

Oui, vous pouvez le faire, mais ce n'est pas le Voir la réponse de Robert –

14

Ce n'est pas le moyen de résoudre ce problème. Vous êtes censé réduire vos objets lorsque vous les créez dans le monde box2D. Ensuite, vous pouvez simplement mettre à l'échelle les informations que box2D vous donne à la taille de votre monde. Par exemple, disons qu'une boîte dans mon monde a une longueur de 120 pixels. Si j'ai redimensionné l'objet de 30 fois pour qu'il puisse être correctement simulé par box2d alors la longueur de ma boîte dans le monde box2D serait de 4 "pixels" (120/30 ou la taille de votre objet/échelle). Maintenant, disons que box2D calcule que ma boîte a déplacé 3 "pixels" dans le monde box2d. Je pourrais alors saisir cette information et la redimensionner à la taille de mon monde, ce qui signifierait que la boîte vient de bouger de 90 pixels (3 * 30). J'espère que cela n'a pas semblé trop confus. J'ai généralement du mal à m'expliquer.

+0

J'ai eu le même problème, et en réduisant la taille de mes choses fixes de simulation –

+5

+1 Du manuel Box2D: "Box2D est réglé pour les unités MKS. Gardez la taille des objets en mouvement entre 0,1 et 10 mètres environ. Vous aurez besoin d'utiliser un système de mise à l'échelle lorsque vous rendez votre environnement et vos acteurs. Le banc d'essai Box2D le fait en utilisant une transformation Openport viewport. "Utilisez les exemples de moteur par exemple HelloWorld pour faire référence à vos propres unités. –