2
    b2Body* foundation =[self createStaticBodyAtLocation:CGPointMake(15, 15) withSize:CGSizeMake(35, 35)];
    b2Body* beam=[self createDynamicBodyAtLocation:CGPointMake(105, 35) withSize:CGSizeMake(150, 10)];
    b2RevoluteJointDef revoluteJointDef;
    revoluteJointDef.Initialize(foundation, beam, b2Vec2(30.0/PTM_RATIO,30.0/PTM_RATIO));
    _world->CreateJoint(&revoluteJointDef);

上記のコードは、静的および動的なボディを作成し、それらをrevolutejointで結合します。これが私が得るものです:

2番目の静的ボディを追加する前

次に、次の行を追加して、静的な円である別のボディを追加し、円と、バーのもう一方の端にある前に追加したバーを結合します。

    b2Body *jointBall=[self createCircleAtLocation:CGPointMake(160, 135)];
    revoluteJointDef.Initialize(jointBall, beam, b2Vec2(100.0/PTM_RATIO,10.0/PTM_RATIO));
    _world->CreateJoint(&revoluteJointDef);

しかし、これが私が得るものです:

2番目の静的ボディを追加した後

円を追加した後、バーを移動できません。修正されました。しかし、私はそれがサークルに加わることを期待しています。アンカーポイントを別の位置に変更しようとしましたが、役に立ちません。私は何が欠けていますか?おそらく、動的ボディを複数の静的ボディに結合することはできません。

4

1 に答える 1

1

box2dマニュアルから:

すべてのジョイントは、2つの異なるボディ間で接続されています。1つのボディが静的である可能性があります。

静的ボディを手動で移動することもできますが、2つ以上の静的ボディ間で動的ボディを押しつぶさないように注意する必要があります。

ここで効果的に行ったことは、回転ジョイントを備えた2つの静的ボディ間のバーボディを押しつぶすことです。静的ボディはまったく移動できないため、表示されている出力は実際には意味があります。最初の回転ジョイント(接続ボックスとバー)により、バーの遠端が(回転して)移動できます。ただし、この遠端が、回転以外のすべての動きを制限する別のジョイントによって別の静的ボディに接続されている場合、それ以上移動することはできません。したがって、2つの異なる静的ボディで結合した後、バーボディの回転が固定されることは理にかなっています。

box2dコードを検索しましたが、ジョイントを介して接続されたボディの回転を直接設定するものは見つかりませんでした。

あなたは何をしようとしているのですか?ボールをバーの端に沿って動かそうとしているようです。その場合は、ボールをダイナミックなボディにすることをお勧めします(ボールが動くようにするため)。また、何をしているのかによっては、溶接継手の方が適切な場合もあります。

于 2013-03-02T16:32:52.730 に答える