回答:
コリンの答えと同様に、b2World.Query()は便利な関数です。aabbを設定して単一のポイントのみをカバーすると、そのポイントと重複する可能性のあるオブジェクトのリストを取得できます。ただし、速度の問題により、バウンディングボックス(AABB)のチェックのみが行われ、必ずしも完全に正確であるとは限らないオーバーラップが検出されます。
フィクスチャー(古いバージョンでは形状)を正確にチェックするには、b2Fixture.TestPoint()関数を使用します。ボディは複数のフィクスチャを持つことができるため、リスト全体をループして確認する必要がある場合があります。これら2つの関数を組み合わせると、必要に応じてPhunの機能を再現できます。
私はこの質問が古いことを知っていますが、単純なコードベースの答えが欠けているように感じます。だからここにあります:
/// <summary>
/// Return if a given position is inside the physical body.
/// </summary>
/// <param name="body">Body to test.</param>
/// <param name="position">Position to check if inside the body.</param>
/// <returns>If given point is inside the physical body.</returns>
public bool TestPointCollision(FarseerPhysics.Dynamics.Body body, Vector2 position)
{
// get body transformation
FarseerPhysics.Common.Transform trans;
body.GetTransform(out trans);
// iterate fixtures to see if any of them hit the point
foreach (var fix in body.FixtureList)
{
if (fix.Shape.TestPoint(ref trans, ref position))
return true;
}
// if there are no hits, return false
return false;
}
これは単純なBox2Dではなく、Farseer(およびC#でも)ですが、まったく同じAPIが必要です。