0

私が読んだことから、Box2dでは、GetJointAngle関数を使用して回転ジョイントの角度を取得しますが、角度を設定しようとすると、メンバーm_referenceAngleが保護されます。プログラムで角度を設定することはできませんか?

ある関節から別の体に角度を適用できることがわかりました。

float FirstAngle = firstArmJoint-> GetJointAngle(); secondArmBody-> SetTransform(b2Vec2((750.0 / PTM_RATIO)、(520.0f + 100)/ PTM_RATIO)、hourAngle);

これをccTouchesMovedに入れて、ユーザーが最初のオブジェクト(FirstAngleの取得元)をドラッグすると、2番目のオブジェクト(secondArmBody)も移動するようにします。

何が起こるかというと、2番目のボディはアンカーポイントではなく画像の上部で回転します。

何か案は?

4

1 に答える 1

0

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

于 2012-07-28T15:59:21.537 に答える