SetTransform()
ボディの位置と回転を設定するために使用できます。これは、体の関節とは完全に独立して起こります。たとえば、特定の瞬間に体が完全に直立していることを確認したい場合は、
body->SetTransForm(body->GetPosition(), 0);
角度値として0を渡します(直立)。関節のある体でこれを試したことはありませんが、うまくいくとは思えません。
ある角度で回転ジョイントポイントを作らなければならないという問題に遭遇したとき、ジョイントでモーターを有効にし、角度が希望の角度になるまでモーター速度を調整することで問題を解決しました。これは、関節のリアルな動きをシミュレートします。例:
ジョイントの作成
b2RevoluteJointDef armJointDef;
armJointDef.Initialize(body1, body2,
b2Vec2(body1->GetPosition().x,
((body1->GetPosition().y/PTM_RATIO));
armJointDef.enableMotor = true;
armJointDef.enableLimit = true;
armJointDef.motorSpeed = 0.0f;
armJointDef.maxMotorTorque = 10000.0f;
armJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(lowerArmAngle);
armJointDef.upperAngle = CC_DEGREES_TO_RADIANS(upperArmAngle);
_world->CreateJoint(&armJointDef);
関節を指す
float targetAngle = SOME_ANGLE;
b2JointEdge *j = body->GetJointList();
b2RevoluteJoint *r = (b2RevoluteJoint *)j->joint;
if(r->GetAngle() > targetAngle){
r->SetMotorSpeed(-1);
} else { r->SetMotorSpeed(1); }
基本的に、現在の角度のどちら側にターゲット角度があるかを確認し、モーター速度を設定して関節を正しい方向に動かします。お役に立てば幸いです。
http://www.box2d.org/manual.html