Flame: Atributos de los cuerpos: 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 a su tamaño. Por ejemplo, un objeto metálico tendría una densidad alta, mientras que un objeto liviano como una globo tendría una densidad baja ya que está principalmente esta 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 inclidado y dejaremos caer un cuerpo sobre él. Observaremos su comportamiento y luego vamos a ajustar sus atributos. Despues, 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 {
@override
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 {
@override
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 {
@override
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
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
¿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 articulo 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. Tambien vimos que cambiar el valor de alguno de ellos puede hacer una gran diferencia en el comportamiento de los cuerpos
Por último, recuerda que puedes encontrar el código fuente de todos los tutoriales en Github, y también puedes probar todos los ejemplos en tu navegador.