libGDX: Fuerzas, impulsos y velocidad lineal

Como sabemos en Box2d existen fuerzas que cuando las aplicamos a los cuerpos crean una simulación real, esto nos permite mover los cuerpos, lanzar pájaros con una resortera, disparar, saltar, etc.

Antes de comenzar recuerda que puedes descargar el código completo en Github y si lo prefieres puedes ver el video tutorial de este articulo.

También puedes correr la aplicación de este tutorial en tu navegador.

Para aprender sobre las diferentes fuerzas vamos a crear 3 pelotas como en la siguiente imagen:

Si han seguido los tutoriales anteriores no tendrán ningún problema en crear las pelotas y el piso. El código para crear las pelotas quedará así y se tiene que llamar desde el constructor:

private Body createBall(float positionX, float positionY) {
	BodyDef bd = new BodyDef();
	bd.position.set(positionX, positionY);
	bd.type = BodyType.DynamicBody;

	CircleShape shape = new CircleShape();
	shape.setRadius(.25f);

	FixtureDef fixDef = new FixtureDef();
	fixDef.shape = shape;
	fixDef.density = 15;
	fixDef.friction = .5f;
	fixDef.restitution = .5f;

	Body oBody = oWorld.createBody(bd);
	oBody.createFixture(fixDef);
	shape.dispose();
	return oBody;
}

La función anterior createBall regresa un objeto Body que tenemos que almacenar en un arreglo arrBalls para poder acceder a sus propiedades más adelante:

arrBalls[0] = createBall(2.5f, .8f); // Pelota de la izquierda
arrBalls[1] = createBall(4.0f, .8f); // Pelota del centro
arrBalls[2] = createBall(5.5f, .8f); // Pelota de la derecha

También es importante ver que las 3 pelotas tienen la misma densidad, fricción y restitución.

Aplicando las fuerzas

Se preguntarán qué pasará si corremos la aplicación en este momento. La respuesta es nada ya que no hemos aplicado las fuerzas a las pelotas. Esto lo haremos dentro del constructor después de haberlas creado de la siguiente manera:

arrBalls[0].applyForceToCenter(speed, true);
arrBalls[1].applyLinearImpulse(speed, arrBalls[1].getWorldCenter(), true);
arrBalls[2].setLinearVelocity(speed);

Recuerdan que habíamos guardado los Body en un arreglo, esto para poder aplicar las fuerzas como pueden ver en el fragmento de código anterior. A la pelota de la izquierda aplicamos una fuerza en el centro, a la pelota del centro un impulso lineal y a la pelota de la derecha le ponemos una velocidad lineal.

Si corremos la aplicación vemos que las pelotas no se mueven de la misma forma:

  • La primera pelota a simple vista no hace nada
  • La segunda pelota se mueve solo un poco
  • La tercera pelota se mueve muy arriba.

Se preguntarán qué está pasando. Vamos a analizar cada una de las funciones:

applyForceToCenter: Aplica una fuerza al centro comúnmente en Newtons en este caso hacia arriba, un ejemplo real sería bajarte de tu automóvil y empujarlo por un instante con una fuerza de 50 Newtons. ¿Qué distancia recorrería? Normalmente no lo empujamos ni 1 metro. Aplicar una fuerza depende del tiempo y en el caso de nuestra pelota sólo lo hacemos un instante por lo que la pelota ni siquiera se levanta.

applyLinearImpulse: Aplica una fuerza comúnmente en Newtons-segundos esto modifica instantáneamente la velocidad del cuerpo en el caso de nuestra pelota hacia arriba, como ejemplo real si empujamos nuestro automóvil con un fuerza de 50 Newtons-segundo ¿Qué distancia recorrería?. Pero qué pasa si empujamos una caja de cartón con la misma fuerza ¿Qué distancia recorrería nuestra caja?. La caja de cartón alcanzaría una distancia muy grande ya que su masa es muy pequeña. Como podemos ver, aplicar un impulso depende de la masa de nuestro cuerpo.

Como ejercicio modifica la densidad de las pelotas. ¿Qué pasa con la pelota del centro cuando pones una densidad muy pequeña?

setLinearVelocity: Por último esta función cambia la velocidad del objeto sin depender del tiempo ni de la masa del cuerpo. En pocas palabras, no importa si modificamos la densidad, la pelota siempre va alcanzar la misma altura.

Nota

A las pelotas la fuerza siempre fue aplicada a su centro, en caso de que aplicáramos la fuerza en un lugar diferente existiría una rotación de los cuerpos

Comparte este artículo