2010-04-05 4 views
8

Penso di aver configurato Box2d per avere una sorta di velocità massima per qualsiasi corpo, ma non ne sono sicuro. Applico un impulso come (100000000, 100000000) e il corpo si muove con la stessa rapidità di (100, 100) - che non è affatto così veloce.Box2d: massima velocità lineare possibile?

Sto usando la porta di Box2d XNA C#.

Il mio gioco è un 2d top-down.

Ecco alcuni codice che potrebbe essere rilevante:

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); 

    //... 
     } 

Ecco alcuni esempi di codice che si applica l'impulso:

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); 
    } 

Se Constants.PLAYER_IMPULSE_CONSTANT è ovunque da 1000f al 1000000000f, il giocatore può muovere al massimo (-120, -120) a (120, 120). Se la costante è inferiore, come 1f, il giocatore si muoverà più lentamente.

Questo codice viene utilizzato per impostare la fisica per tutto nel mondo di gioco:

 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); 

Potrebbe forse essere lineare smorzamento? L'ho modificato da 10.0f a 0, senza alcun effetto.

UPDATE: Stranezze con smorzamento lineare: Feci queste osservazioni sul corpo che si muove con il metodo dell'impulso applicare sopra:

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

Perché c'è un intervallo di sensibilità lineare smorzamento tra 50f e 60f?

+0

Il codice che applica l'impulso potrebbe essere utile. –

+0

Siamo spiacenti. Aggiunto. –

+0

+1 per neutralizzare chi ha votato questo in basso. Questa è una domanda legittima. – avpx

risposta

3

Ho lo stesso problema con la versione 2.1a ho scoperto che la modifica della riga 128 in b2Settings.as può aiutare. Cambia pubblico statico const b2_maxTranslation: Number = 2.0 a un numero più alto. sicuro che questo non è il modo giusto, ma in questo momento non so davvero come farlo correttamente.

+0

wow. è strano, ma è stato risolto. –

+8

Mi sono imbattuto in questo problema oggi, tranne che stavo usando la versione C++ di Box2D. I commenti dicevano: "La massima velocità lineare di un corpo Questo limite è molto grande e viene usato per prevenire problemi numerici. Non dovresti aver bisogno di aggiustarlo."La mia simulazione era impostata su 1 pixel, uguale a 1 unità Box2D, stavo avendo lo stesso problema con il limite di velocità. Suoni come Box2D ti piace mantenere la tua simulazione su scala più piccola – don

+0

Sì, puoi farlo, ma non è il Vedere la risposta di Robert –

14

Questo non è il modo per risolvere questo problema. Dovresti ridimensionare i tuoi oggetti quando li crei nel mondo di box2D. Quindi puoi semplicemente ridimensionare le informazioni che box2D ti riporta alle dimensioni del tuo mondo.

Diciamo ad esempio che una scatola nel mio mondo è lunga 120 pixel. Se ho ridimensionato l'oggetto di 30 volte in modo che possa essere simulato correttamente da box2d, la lunghezza della mia casella nel mondo box2D sarebbe di 4 "pixel" (120/30 o dimensione dell'oggetto/scala). Ora, diciamo che box2D calcola che la mia scatola ha spostato 3 "pixel" nel mondo box2d. Potrei quindi prendere queste informazioni e ridimensionarle in base alle dimensioni del mio mondo, il che significherebbe che la scatola si è appena spostata di 90 pixel (3 * 30). Spero che non sia sembrato troppo confuso. Di solito trovo difficile spiegarmi.

+0

Ho avuto lo stesso problema e ho ridimensionato le dimensioni della mia simulazione risolti 1. –

+5

+1. Dal manuale di Box2D: "Box2D è ottimizzato per le unità MKS. Mantieni le dimensioni degli oggetti in movimento all'incirca tra 0,1 e 10 metri. Dovrai utilizzare un sistema di ridimensionamento quando esegui il rendering dell'ambiente e degli attori. Il banco di prova Box2D fa ciò usando una trasformazione della vista OpenGL. "Usa gli esempi del motore, ad esempio HelloWorld, per fare riferimento alle tue unità contro. –