Box2Dポイントがボディと交差するかどうかをチェック


10

ポイントがボディと交差しているかどうかを確認する方法はありますか?

たとえば、世界の(100,100)の位置にボディがあるとしましょう。

(100,100)の点がそのボディと交差するかどうかを確認する方法はありますか?

別の例は、「PHUN」と呼ばれるゲームに関連しています。PHUNでは、ボディをクリックしてドラッグできます。マウスポイントがボディと交差しているかどうかをどのように確認しますか?

回答:


5

コリンの答えと同様に、b2World.Query()は便利な関数です。aabbを設定して単一のポイントのみをカバーすると、そのポイントと重複する可能性のあるオブジェクトのリストを取得できます。ただし、速度の問題により、バウンディングボックス(AABB)のチェックのみが行われ、必ずしも完全に正確であるとは限らないオーバーラップが検出されます。

フィクスチャー(古いバージョンでは形状)を正確にチェックするには、b2Fixture.TestPoint()関数を使用します。ボディは複数のフィクスチャを持つことができるため、リスト全体をループして確認する必要がある場合があります。これら2つの関数を組み合わせると、必要に応じてPhunの機能を再現できます。


2

b2QueryCallbackどのフィクスチャにポイントが含まれているかを確認し、b2MouseJointオブジェクトをマウスに追従させるために使用します。私はいくつかのサンプルコードを持っていますが、今はそれを単純化する時間はありません。必要な場合は後で提供できます。


2

形状の内側にあることがわかっている点がある場合は、マウスの位置とその点を結ぶ線を形状の境界と交差させることができます。交点が奇数の場合、ポイントは内側になります。交差数が偶数の場合、ポイントは外側になります。

代替テキスト
(ソース:co.uk

緑の点はマウスの位置、赤は形状内の既知の点です。

たとえば、ポイントを結ぶ線がエッジと一致する場合など、エッジのケースがありますが、これにより、90%の距離が得られます。


0

私はこの質問が古いことを知っていますが、単純なコードベースの答えが欠けているように感じます。だからここにあります:

    /// <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が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.