Por cierto, he hecho exactamente lo que estás tratando de hacer. El único inconveniente es que estaba usando Jbox2d, por lo que el código está en Java, pero aún así debería poder resolverlo si está usando C ++
Básicamente, necesitas usar articulaciones / motores y todas esas cosas divertidas si quieres hacer una acción de balanceo. Aquí hay un fragmento de cómo se ve mi código basado en la entrada clave:
if (myinput.mouse0) {
agents.get(0).rightForeJoint.enableMotor(true);
agents.get(0).rightArmJoint.enableMotor(false);
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)){
agents.get(0).rightForeJoint.enableMotor(false);
}
mouseY = Mouse.getY();
mouseX = Mouse.getX();
float temp = mouseY - prevPos[1];
float temp2 = -mouseX + prevPos[0];
temp2 *= modifier; temp2 *= 0.000026;
temp *= modifier; temp *= 0.000030;
agents.get(0).armR.applyAngularImpulse(-temp);
agents.get(0).foreR.applyAngularImpulse(temp2);
prevPos[1] = mouseY;
prevPos[0] = mouseX;
if(temp2 < 0){
temp2 *=-1;
}
if(temp < 0){
temp *=-1;
}
fatigueDrain += temp2;
fatigueDrain += temp;
}
Y luego, en cuanto a la construcción de los brazos y demás, el fragmento se ve así.
// RIGHTARM //
this.rightArmDef = new RevoluteJointDef();
this.rightArmDef.bodyA = this.torso ; this.rightArmDef.bodyB = this.armR;
this.rightArmDef.collideConnected = false;
torso_armL_pin = new Vec2(0.50f, +0.05f);
local_armL_pin = new Vec2(0.14f, 0.14f);
this.rightArmDef.localAnchorA.set(this.torso.getLocalCenter().add(torso_armL_pin));
this.rightArmDef.localAnchorB.set(this.armR.getLocalCenter().add(local_armL_pin));
this.rightArmDef.enableMotor = true;
this.rightArmDef.motorSpeed = 0f;
this.rightArmDef.maxMotorTorque =10f;
this.rightArmDef.enableLimit = true;
this.rightArmDef.lowerAngle = 1.2f;// * DEGTORAD;
this.rightArmDef.upperAngle = 5;
this.rightArmJoint = (RevoluteJoint)world.createJoint(this.rightArmDef);
Me doy cuenta de que están sucediendo muchas cosas aquí, pero probablemente sea más fácil si me preguntas sobre qué necesitas claridad y te lo explico. Sin embargo, si nunca ha usado alguna de estas cosas, probablemente tendrá que leer bastante.
EDITAR >>
Tenga en cuenta que Box2d tiene toda la detección de colisiones y la física integrada en sus bibliotecas. Tómelo con fe cuando digo que es más fácil descubrir su sistema que tratar de hacer las cosas desde cero. Si desea colisión, utiliza accesorios bodydefs, si desea que giren o se muevan, use juntas. Puede parecer un poco más complicado al principio, pero al final le ahorra infinitamente más tiempo para usar sus métodos.
De hecho, sugeriría que probablemente nunca terminarás si intentas hacer cosas desde cero, suponiendo que estés creando un juego de física. Porque calcular cosas como la fricción, la flotabilidad y, por no mencionar, la detección eficiente / de colisión, te llevará toda la vida.