0

2 つのオブジェクトがあり、それらの間の距離が 10 未満の場合、ジョイントを作成します。

var joint_def = new box2d.b2RevoluteJointDef();
joint_def.bodyA = body1;
joint_def.bodyB = body2;
joint_def.localAnchorA = new box2d.b2Vec2(0, 0);
joint_def.localAnchorB = new box2d.b2Vec2(0, 0);
world.CreateJoint(joint_def);

ただし、問題は、1 つのオブジェクトが他のオブジェクトの上にテレポート/ジャンプすることです。意図した動作は、1 つのオブジェクトが他のオブジェクトの上をゆっくりと移動することです。

何か案が?ありがとう。

4

1 に答える 1

1

次の 2 つの問題があると思います。

問題 #1: localAnchorA と localAnchorB は、ジョイントを配置するポイントです。これは、それぞれのボディのローカル座標系にマップされたワールド空間のポイントになります。これは手動で行うことも、joint_def の関数を使用して行うこともできます (少なくとも C++ ではこのように動作します)。

自動的:

b2RevoluteJointDef jointDef;
b2Vec2 anchor = _body->GetWorldCenter();
jointDef.Initialize(_body, otherBody, anchor);
jointDef.collideConnected = true;
_world->CreateJoint(&jointDef);

手動:

   b2RevoluteJointDef jointDef;
   b2Vec2 anchor = _body->GetWorldCenter();
   jointDef.bodyA = _body;
   jointDef.bodyB = otherBody;
   jointDef.localAnchorA = _body->GetLocalPoint(anchor);
   jointDef.localAnchorB = otherBody->GetLocalPoint(anchor);
   jointDef.referenceAngle = otherBody->GetAngle() - _body->GetAngle();
   _world->CreateJoint(&jointDef);

b2Vec2(0,0) でアンカー ポイント (両方) を初期化しています。 このコード ベースを使用して、違いがどのように見えるかを示します

各ボディのローカル スペースに両方のアンカー ポイントが定義されている場合:

ここに画像の説明を入力

「T」は回転していますが、他の物体は動いていないことに注意してください。しかし、ジョイントはそれらを互いに回転した距離に保ちます。

両方のローカル アンカー ポイントが (0,0) に設定されている場合:

ここに画像の説明を入力

一般に、Initialize(...) メソッドがある場合は、それを使用してジョイントを作成します。

問題 #2: ボディを 10m 離して開始し、そこに回転ジョイントを作成すると、ボディはそこにとどまります。それらがお互いに向かって動き始めたい場合...これを行う最も簡単な方法は(そして私はそれをやった...ここを参照)、2つの間にロープジョイントを取り付けてから、物理ループで、次のようにします (ロープ ジョイントがボディに接続された最初で唯一のジョイントであることを知っています)。

  b2JointEdge* jointEdge = GetBody()->GetJointList();
  b2RopeJoint* rope = (b2RopeJoint*)jointEdge->joint;
  rope->SetMaxLength(rope->GetMaxLength()-_ropeClimbDistPerUpdate);

ロープの長さが許容範囲を下回ったら、回転ジョイントを接続します。クモを小惑星からスイングさせるのはかなりうまくいきます...

b2RopeJoint の代わりに b2DistanceJoint を使用することもできます。ロープ ジョイントは最大距離を拘束し、距離ジョイントは固定距離を拘束します。この状況では、ほぼ同じように機能するはずです。ロープ ジョイントは、他の box2d ポートには存在しない場合があります。

これはあなたが必要としていたものでしたか?

于 2013-12-31T00:03:21.447 に答える