Per inciso, ho fatto esattamente quello che stai cercando di fare. L'unico problema è che stavo usando Jbox2d, quindi il codice è in Java, ma dovresti essere ancora in grado di capirlo se stai usando C ++
Fondamentalmente devi usare giunti / motori e tutte quelle cose divertenti se vuoi fare un'azione oscillante. Ecco uno snippet di come appare il mio codice basato sull'input chiave:
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 poi per quanto riguarda effettivamente la costruzione delle armi e quant'altro, lo snippet si presenta così.
// 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);
Mi rendo conto che qui sta succedendo molto, ma probabilmente è più facile se mi chiedi su cosa hai bisogno di chiarezza e te lo spiego. Se non hai mai usato nessuna di queste cose, probabilmente avrai bisogno di leggere un bel po '.
EDIT >>
Realizza, Box2d ha tutto il rilevamento delle collisioni e la fisica integrata nelle sue librerie. Dagli fede quando dico che è più facile capire il loro sistema che provare a fare le cose da zero. Se si desidera una collisione, si utilizzano infissi bodydefs, se si desidera che ruotino o si muovano, si utilizzano giunti. All'inizio può sembrare un po 'più complicato, ma alla fine ti fa risparmiare infinitamente più tempo per usare i loro metodi.
In effetti, suggerirei che probabilmente non finirai mai se provi a fare le cose da zero, supponendo che tu stia creando un gioco di fisica. Perché calcolare cose come attrito, galleggiamento e, per non parlare, / rilevamento efficiente / di collisione, ti richiederà una vita.