Saltar al contenido principal

Fricción, densidad y restitución

Youtube video player

Youtube video player

En Forge2D los cuerpos tienen tres atributos muy importantes: densidad, fricción y restitución. Estos atributos determinan el comportamiento de los cuerpos dentro del mundo.

Densidad

La densidad se refiere a la cantidad de masa que tiene por unidad de área. Se expresa en kilogramos por metro cuadrado (kg/m²). Una densidad mayor significa que el cuerpo es más pesado en relación con su tamaño. Por ejemplo, un objeto metálico tendría una densidad alta, mientras que un objeto liviano como un globo tendría una densidad baja, ya que está principalmente está lleno de aire.

Fricción

La fricción entra en juego cuando dos cuerpos se deslizan entre sí. Un valor de fricción más alto significa que el cuerpo tendrá una mayor resistencia al deslizamiento. Por ejemplo un bloque de hielo tendría una fricción muy baja, pero una pelota de goma tendría una fricción alta.

Restitución

La restitución determina cuánto rebotará un cuerpo después de una colisión. Por ejemplo, una roca tendría una restitución muy baja y no rebotaría mucho, mientras que una pelota de baloncesto tendría una restitución alta y rebotaría fácilmente.

Ejemplo

La mejor forma de aprender es a través de un ejemplo práctico. En este caso, utilizaremos un pequeño ejemplo para analizar el comportamiento de un cuerpo al modificar sus atributos. Vamos a crear un suelo inclinado y dejaremos caer un cuerpo sobre él. Observaremos su comportamiento y luego vamos a ajustar sus atributos. Después, dejaremos caer el objeto otra vez para ver los cambios y observar cómo se comporta en esta nueva configuración.

Para modificar la fricción, la densidad o la restitución de un objeto, se puede utilizar el accesorio correspondiente de la siguiente manera:

final fixtureDef = FixtureDef(shape)
..density = 10
..friction = .5
..restitution = .5;

Comenzaremos creando la clase Box que representará el cuerpo que dejaremos caer sobre el suelo. Utilizaremos la forma PolygonShape para definir su forma:

class Box extends BodyComponent {

Body createBody() {
final bodyDef = BodyDef(
position: Vector2(10, 0),
type: BodyType.dynamic,
);

final shape = PolygonShape()..setAsBoxXY(.25, .25);
final fixtureDef = FixtureDef(shape)
..density = 10
..friction = .5
..restitution = .5;
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}

Luego, crearemos la clase Floor que representará el suelo. Utilizaremos la forma EdgeShape para definir su forma:

class Floor extends BodyComponent {

Body createBody() {
final bodyDef = BodyDef(
position: Vector2(0, worldSize.y - .75),
type: BodyType.static,
);

final shape = EdgeShape()..set(Vector2.zero(), Vector2(worldSize.x, -2));
final fixtureDef = FixtureDef(shape)..friction = .1;
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}

Ahora vamos a añadir el objeto Floor y el objeto Box al juego:

class GameLesson03 extends MyGame {

Future<void> onLoad() async {
super.onLoad();
add(Floor());
add(Box());
}
}

Vamos a ejecutar el código y, como resultado, obtendremos lo siguiente:

Caja rebotando muy bajo

Caja rebotando muy bajo

Veamos qué sucede si modificamos el valor de restitución por restitution = 1. Podemos realizar este cambio de la siguiente manera:

final fixtureDef = FixtureDef(shape)
..density = 10
..friction = .5
..restitution = 1;
Caja rebotando muy alto

Caja rebotando muy alto

¿Has notado la diferencia? Cuando el valor de restitución se establece en restitution = 1, la caja rebotará a una altura considerablemente mayor. Ahora puedes experimentar con los valores de densidad, fricción y restitución para obtener resultados diferentes.

Conclusión

En este artículo aprendimos que la densidad, la fricción y la restitución son atributos clave en Forge2D que influyen en cómo se mueven, chocan y reaccionan los cuerpos en nuestro juego. También vimos que cambiar el valor de alguno de ellos puede hacer una gran diferencia en el comportamiento de los cuerpos

info

Prueba el demo en tu navegador y descarga el código fuente de todos los tutoriales en GitHub.