2

2 つの box2d ボディがあり、1 つは静的で、もう 1 つは動的です。これで、 を介して静的ボディを動的ボディに結合しましたb2revoluteJoint。だから私の質問は:

touchMoved1) ダイナミック ボディの同じ位置にアタッチされているスタティック ボディと一緒にダイナミック ボディを移動するにはどうすればよいですか。

2) 2 つ以上のボディを移動するにはどうすればよいですか。私が人間の体を持っていて、足と手が でつながっているとしましょうb2RevoluteJoint。すべてのボディを一緒に移動して、自然な外観を作成するにはどうすればよいでしょうか。

私はbox2dでまったく新しいので、いくつかの問題があります。誰でもこの問題に関して私を助けてください.Thanks!

4

2 に答える 2

2

MouseJoint を使用してダイナミック ボディを動かすことができますが、動きが「自然」に見えない場合があります。

「シーク」動作を使用して、1 つのボディをタッチ ポイントに向かって移動できます。体を動かす速さの制限を設定し、画面上のタッチ ポイントを box2d ワールド スペース内のポイントに変換する必要があります。それができたら、次のような関数を使用して、体をタッチポイントに向かって移動できます。エンティティの各物理更新サイクルでこの操作を呼び出します。

   void MoveToTarget()
   {
      // Get the distance to the target.
      Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter();
      toTarget.Normalize();
      Vec2 desiredVel = GetMaxSpeed()*toTarget;
      Vec2 currentVel = GetBody()->GetLinearVelocity();
      Vec2 thrust = desiredVel - currentVel;
      GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust);
   }

私はこれをミサイルにうまく使用し、ある程度の成功を収めました(ブログ投稿はこちらを参照)。ソースコードもサイトで公開されています。

複数のボディを接続し、それらを純粋な物理学を使用して動かすことができます。しかし、これは本当に難しいです。私は別のプロジェクトでクモを作成する際に同様の問題を抱えていましたが、2D スケルトン アニメーション ツール ( Spine ) を使用して、適切な形状 (クモは非常に大きなブロブであるため、球体で適切に処理されます) を体の上に配置するのが最善であることがわかりました。 box2d で移動と衝突検出を処理します。

一方、回転ジョイントで接続された一連のボールを使用してヘビを作成しました。最初の (最大の) ボールのシーク動作により、モーションは非常に見栄えがします。

これは役に立ちましたか?

于 2013-11-12T12:01:43.110 に答える
1

1) box2d でオブジェクトをドラッグする場合は、mouseJoint です。touchBegan では、動かしたいオブジェクトと任意の静的ボディ (groundBody など) を使用してマウス ジョイントを作成しますが、このジョイントではすべての静的ボディを使用できます。touchMoved では、mouseJoint の位置を変更します。In touchEnded ジョイントを破壊します :)

2) より多くの revoluteJoints を作成できます。たとえば、脚と本体がジョイントされ、腕と本体もジョイントされます。

于 2013-11-12T10:25:21.133 に答える