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 で移動と衝突検出を処理します。
一方、回転ジョイントで接続された一連のボールを使用してヘビを作成しました。最初の (最大の) ボールのシーク動作により、モーションは非常に見栄えがします。
これは役に立ちましたか?