4. Empalmes (joints) - nelsonmoreno/Box2d GitHub Wiki
Otra manera de construir objetos mas complejos es unir varios cuerpos usando empalmes (joints). Los empalmes pueden restringir los movimientos de los objetos que están unidos. Los tipos de empalmes varian de una versión de Box2d a otra, la siguiente es una lista de los mas comunes:
- Distancia
- Fricción
- Engranajes
- Lineas
- Ligas
- Deslizadores
- Poleas
- Soldaduras
- Junta: permite que dos cuerpos giren en torno a un punto compartido
- Ruedas
- Cuerdas
Hay que tener presente que los empalmes solo puede unir cuerpos (bodies) por lo que para evitar comportamientos anómalos es común ver que las uniones con objetos pequeños se hacen en el centro de estos usando la función 'GetWorldCenter()'.
RevoluteJoint
A continuación se muestra un fragmento del código con la definición, inicialización y creación de un empalme (joint) de tipo (RevoluteJoint):
var joint = new b2RevoluteJointDef();
joint.Initialize(body1, body2, body1.GetWorldCenter());
this.world.CreateJoint(joint);
Fíjese que no estamos definiendo ninguna posición de empalme para el primer cuerpo (body1), esto es porque suponemos que ambos cuerpos están en la posición correcta (body1 y body2).
El API de Box2d proporciona las funciones requeridas para configurar los atributos de un empalme como por ejemplo la velocidad, el torque, el mínimo ángulo... consulte el API Doc para conocer los detalles.
El siguiente fragmento muestra el uso de algunos de estos atributos:
var joint = new b2RevoluteJointDef();
joint.Initialize(wellBody1, boxBody, wellBody1.GetWorldCenter());
joint.motorSpeed = -3;
joint.maxMotorTorque = 30;
joint.enableMotor = true;
this.world.CreateJoint(joint);
Aquí puedes ver el código completo y la demostración
PulleyJoint
De forma similar podemos crear un empalme con poleas, en este caso debemos definir los puntos donde anclan los cuerpos y las poleas:
var joint = new b2PulleyJointDef();
var anchor1 = new b2Vec2(5, 11.7);
var anchor2 = new b2Vec2(15, 6);
var groundAnchor1 = new b2Vec2(5, 2 );
var groundAnchor2 = new b2Vec2(15, 2);
joint.Initialize(body1, body2, ground1, ground2, anchor1, anchor2, 1.5);
this.world.CreateJoint(joint);
Esto se entiende mejor con la siguiente figura:
Aquí puedes ver el código completo y la demostración