Fricción, densidad y restitución
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:
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;
¿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