2010-04-05 13 views
8

Creo que he configurado Box2d para tener algún tipo de velocidad máxima para cualquier cuerpo, pero no estoy seguro. Aplico un impulso como (100000000, 100000000), y el cuerpo se mueve tan rápido como (100, 100) - que no es tan rápido en absoluto.Box2d: velocidad lineal máxima posible?

Estoy usando el puerto Box2d XNA C#.

Mi juego es un 2d de arriba hacia abajo.

Aquí hay un código que puede ser relevante:

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

    //... 
     } 

Aquí es un código de ejemplo que se aplica el 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); 
    } 

Si Constants.PLAYER_IMPULSE_CONSTANT es en cualquier lugar de 1000f a 1000000000f, el jugador puede mover a lo sumo (-120, -120) a (120, 120). Si la constante es menor, como 1f, el reproductor se moverá más lentamente.

Este código se utiliza para configurar la física para todo en el mundo del juego:

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

¿Podría ser el amortiguamiento lineal? Lo cambié de 10.0f a 0, sin ningún efecto.

ACTUALIZACIÓN: Weirdness con amortiguación lineal: He hecho estas observaciones en el cuerpo que se movía con la aplicar el método de impulso anterior:

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

Por qué hay un rango de sensibilidad de amortiguamiento lineal entre 50f y 60f?

+0

El código que aplica el impulso puede ser útil. –

+0

Lo siento. Lo agregué. –

+0

+1 para contrarrestar a quien lo votó. Esta es una pregunta legítima. – avpx

Respuesta

3

que tienen el mismo problema con la versión 2.1a me enteré de que el cambio de la línea 128 en b2Settings.as puede ayudar. Cambiar const b2_maxTranslation público estático: Número = 2.0 a un número más alto. seguro de que esta no es la manera correcta, pero en este momento no sé realmente cómo hacerlo correctamente.

+0

wow. eso es raro, pero lo solucionó. –

+8

Acabo de encontrarme con este problema hoy, excepto que estaba usando la versión C++ de Box2D. Los comentarios dicen: "La velocidad lineal máxima de un cuerpo. Este límite es muy grande y se usa para evitar problemas numéricos. No debería necesitar ajustar esto."Mi simulación se configuró en 1 píxel equivale a 1 unidad Box2D. Estaba teniendo el mismo problema con el límite de velocidad. Parece que a Box2D le gusta que mantenga su simulación en una escala menor. – don

+0

Sí, puede hacerlo, pero no es el de forma correcta. Ver la respuesta de Robert. –

14

Esa no es la forma de solucionar ese problema. Se supone que debes reducir tus objetos al crearlos en el mundo de box2D. Luego puede escalar la información que box2D le devuelve al tamaño de su mundo.

Digamos, por ejemplo, que una caja en mi mundo tiene 120 píxeles de largo. Si escalé el objeto 30 veces para que pueda ser simulado por box2d correctamente, entonces la longitud de mi caja en el mundo de box2D sería de 4 "píxeles" de largo (120/30 o el tamaño de tu objeto/escala). Ahora, digamos que box2D calcula que mi cuadro movió 3 "píxeles" en el mundo box2d. Podría tomar esa información y subirla al tamaño de mi mundo, lo que significaría que la caja acaba de mover 90 píxeles (3 * 30). Espero que eso no suene demasiado confuso. Por lo general, me resulta difícil explicarme.

+0

Tuve el mismo problema y reduje el tamaño de mi simulación. –

+5

+1. Del manual de Box2D: "Box2D está sintonizado para unidades MKS. Mantenga el tamaño de los objetos en movimiento aproximadamente entre 0.1 y 10 metros. Tendrá que usar algún sistema de escala cuando renderice su entorno y actores. El banco de pruebas de Box2D lo hace usando una transformación de ventana OpenGL. "Use los ejemplos de motor, por ejemplo, HelloWorld para hacer referencia a sus propias unidades. –

Cuestiones relacionadas