Skip to content

fisica‐es

JNightRide edited this page Dec 17, 2023 · 9 revisions

Física

jMe3GL2 integra Dyn4j como motor de física, inicializamos el espacio físico de la siguiente manera:

Dyn4jAppState<PhysicsBody2D> dyn4jAppState = new Dyn4jAppState<>(ThreadingType.PARALLEL);
stateManager.attach(dyn4jAppState);

Puede iniciar de forma paralela (ThreadingType.PARALLEL) o secuencial (ThreadingType.SEQUENTIAL). Si requiere que los cuerpos físicos tengan una mejor sincronización con los modelos se recomienda la forma paralela (esta forma puede generar costos ya que sincroniza el motor de la física con jme3).

Generando cuerpos físicos.

Cuerpo - Terreno

¿Recuerdas el terreno (suelo)?, utilizaremos este modelo para generar el primer cuerpo físico:

...
RigidBody2D floorBody2D = new RigidBody2D(new RectangleCollisionShape(floorSprite.getWidth(), floorSprite.getHeight()));
floorBody2D.setMass(MassType.INFINITE);
floorBody2D.translate(0, -4);

/* Agregando el cuerpo físico al modelo. */
floor.addControl(floorBody2D);

/* Agregar la forma física al espacio. */
dyn4jAppState.getPhysicsSpace().addBody(floorBody2D);
...

En este cuerpo utilizamos un rectángulo como forma física, cada cuerpo que utiliza el motor es un objeto control para los Spatial de JME a su vez un Body de Dyn4j. Esta forma de trabajar facilita el acceso al cuerpo físico a sí mismo con el control del modelo.

NOTA: Si quiere remover o hacer una acción que puede provocar una ruptura en el proceso central del JME, se recomienda sincronizar los procesos para evitar el problema.

Cuerpo - Jugador

De la misma formas agregamos un cuerpos físico al al cubo con cara (el jugador), Esta vez utilizado una forma generada por la clase utilidades GeometryUtilities:

...
RigidBody2D playerBody2D = new RigidBody2D();
BodyFixture bodyFixture = new BodyFixture(GeometryUtilities.createRectangle(sprite.getWidth(), sprite.getHeight()));

playerBody2D.addFixture(bodyFixture);
playerBody2D.setMass(MassType.NORMAL);

geom.addControl(playerBody2D);
dyn4jAppState.getPhysicsSpace().addBody(playerBody2D);
...

GeometryUtilities es una clase auxiliar que evitar una confusión con el objeto-clase com.jme3.scene.Geometry (JME3) y org.dyn4j.geometry.Geometry (Dyn4j).

CÓDIGO [ DEPURADOR ]

Por el momento nuestro código debería tener los siguiente:

...
/* Espacio físico */
Dyn4jAppState<PhysicsBody2D> dyn4jAppState = new Dyn4jAppState<>(ThreadingType.PARALLEL);
stateManager.attach(dyn4jAppState);


/* Modelo jugador */
Sprite sprite = new Sprite(1, 1);

Geometry geom = new Geometry("Geom", sprite);
geom.setMaterial(MaterialUtilities.getUnshadedMaterialFromClassPath(assetManager, "Textures/blue_body_square_01.png"));
geom.setQueueBucket(RenderQueue.Bucket.Transparent);

RigidBody2D playerBody2D = new RigidBody2D();
BodyFixture bodyFixture = new BodyFixture(GeometryUtilities.createRectangle(sprite.getWidth(), sprite.getHeight()));

playerBody2D.addFixture(bodyFixture);
playerBody2D.setMass(MassType.NORMAL);

geom.addControl(playerBody2D);
dyn4jAppState.getPhysicsSpace().addBody(playerBody2D);
rootNode.attachChild(geom);

// ------------------------------------------------------------------------------------------------------------//
/* Terreno - Suelo. */
Sprite floorSprite = new Sprite(20, 1);
floorSprite.scaleTextureCoordinates(new Vector2f(20, 1));

Geometry floor = new Geometry("Ground", floorSprite);
floor.setMaterial(MaterialUtilities.getUnshadedMaterialFromClassPath(assetManager, "Textures/ground.png"));

RigidBody2D floorBody2D = new RigidBody2D(new RectangleCollisionShape(floorSprite.getWidth(), floorSprite.getHeight()));
floorBody2D.setMass(MassType.INFINITE);
floorBody2D.translate(0, -4);

/* Agregando el cuerpo físico al modelo. */
floor.addControl(floorBody2D);

/* Agregar la forma física al espacio. */
dyn4jAppState.getPhysicsSpace().addBody(floorBody2D);
rootNode.attachChild(floor);


// ------------------------------------------------------------------------------------------------------------//
/* Fondo */
Sprite spriteBG = new Sprite(20, 10);
spriteBG.scaleTextureCoordinates(new Vector2f(2, 1));

Geometry bg = new Geometry("Background", spriteBG);
bg.setMaterial(MaterialUtilities.getUnshadedMaterialFromClassPath(assetManager, "Textures/backgroundForest.png"));
bg.move(0, 0, -1);

rootNode.attachChild(bg);
...

Hasta este punto ya sabes crear tus modelos ‘2D’ sin ningún problema, utilizas física en tus escenas. Con las articulaciones, Dyn4j proporciona soporte para ello; solo necesitas imaginación (ejemplos dyn4j)


Siguiente

Clone this wiki locally