libGDX: Fricción, densidad y restitución
Como ya vimos antes los cuerpos tienen diferentes propiedades algunas de las más importantes son la fricción, la densidad y la restitución. Estas propiedades afectan el comportamiento de los cuerpos en nuestro mundo.
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.
Densidad
La densidad multiplicada por el área de la figura es la masa del cuerpo. Entre más alta la densidad más pesado el cuerpo.
Fricción
Es la fuerza de rozamiento que existe entre dos cuerpos en contacto. En box2D esta fuerza se aplica a los cuerpos con valores desde 0 cuando no existe la fricción hasta 1 cuando la fricción es muy alta. Para conocer cómo se comporta la fricción agregamos un objeto estático con una inclinación que será el piso:
private void createFloor() {
BodyDef bd = new BodyDef();
bd.position.set(0, .5f);
bd.type = BodyType.StaticBody;
EdgeShape shape = new EdgeShape();
shape.set(0, 0, WORLD_WIDTH, 1.5f);
FixtureDef fixDef = new FixtureDef();
fixDef.shape = shape;
Body oBody = oWorld.createBody(bd);
oBody.createFixture(fixDef);
shape.dispose();
}
También agregamos una caja con un poco de fricción:
private void createBox() {
BodyDef bd = new BodyDef();
bd.position.set(7, 4);
bd.type = BodyType.DynamicBody;
PolygonShape shape = new PolygonShape();
shape.setAsBox(.2f, .2f);
FixtureDef fixDef = new FixtureDef();
fixDef.shape = shape;
fixDef.density = 1f;
fixDef.friction = .7f;
Body oBody = oWorld.createBody(bd);
oBody.createFixture(fixDef);
shape.dispose();
}
Como pueden ver la caja tiene 0.7 de fricción. Al correr la aplicación tenemos una caja que cae, no rebota en el piso y se desliza un poco antes de detenerse:
Restitución
Es la capacidad de rebote de un cuerpo, esto quiere decir que tanto va rebotar un cuerpo después de una colisión y como la fricción tiene un valor que va desde 0 que es sin rebote hasta 1 qué es rebote máximo.
Para probar utilizaremos el mismo ejemplo anterior de la caja, pero esta vez agregaremos una restitución de 1 con la siguiente línea de código.
fixDef.restitution = .7f;
¿Qué pasa con el cuerpo?. Con una restitución de 1 el cuerpo ya no sólo choca con el piso y se desliza ahora al colisionar también rebota, como se ve en la siguiente imagen:
Conclusión
En este tutorial aprendimos sobre algunas de las propiedades más importantes que pueden tener los cuerpos en el mundo. El simple hecho de modificar alguna de estas propiedades puede hacer que el cuerpo actúe de forma totalmente diferente.