Aliás, eu fiz exatamente o que você está tentando fazer. O único problema é que eu estava usando o Jbox2d, então o código está em Java, mas você ainda deve descobrir se está usando C ++
Basicamente, você precisa usar juntas / motores e todas essas coisas divertidas se quiser fazer uma ação de balanço. Aqui está um trecho da aparência do meu código com base na entrada principal:
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;
}
E então, na medida em que realmente constrói os braços e outros enfeites, o trecho se parece com isso.
// 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);
Sei que há muita coisa acontecendo aqui, mas provavelmente será mais fácil se você me perguntar o que precisa de clareza e eu explicá-la. Se você nunca usou nenhuma dessas coisas, provavelmente precisará ler bastante.
EDIT >>
Perceba que o Box2d possui toda a detecção e física de colisões integradas em suas bibliotecas. Acredite quando digo que é mais fácil descobrir o sistema deles do que tentar fazer as coisas do zero. Se você quiser uma colisão, use os equipamentos bodydefs; se quiser que eles girem ou se movam, use juntas. Pode parecer um pouco mais complicado a princípio, mas no final você economiza infinitamente mais tempo para usar os métodos deles.
Na verdade, eu sugiro que você provavelmente nunca termine se tentar fazer as coisas do zero, supondo que esteja criando um jogo de física. Porque calcular coisas como atrito, flutuabilidade e para não mencionar / detecção eficiente / de colisão, levará uma vida inteira.