Box2D Überprüfen Sie, ob der Punkt einen Körper schneidet

10

Gibt es eine Möglichkeit zu überprüfen, ob ein Punkt einen Körper schneidet?

Nehmen wir zum Beispiel an, es gibt einen Körper auf der Welt an einer Position von (100.100).

Gibt es eine Möglichkeit zu überprüfen, ob ein Punkt bei (100.100) diesen Körper schneidet?

Ein anderes Beispiel bezieht sich auf ein Spiel namens "PHUN". In PHUN können Sie Körper anklicken und ziehen. Wie würden Sie überprüfen, ob ein Mauspunkt einen Körper schneidet?

xAustechx
quelle

Antworten:

5

Wie bei der Antwort von colin ist b2World.Query () eine nützliche Funktion. Wenn Sie das aabb so einstellen, dass es nur einen einzelnen Punkt abdeckt, können Sie eine Liste von Objekten erhalten, die diesen Punkt möglicherweise überlappen. Aus Geschwindigkeitsgründen wird jedoch nur der Begrenzungsrahmen (AABB) auf eine Überlappung überprüft, die nicht immer ganz genau ist.

Verwenden Sie die Funktion b2Fixture.TestPoint (), um ein Gerät (Form, in älteren Versionen) genau zu überprüfen. Da ein Körper mehrere Geräte haben kann, müssen Sie möglicherweise die gesamte Liste durchlaufen, um sicherzugehen. Wenn Sie diese beiden Funktionen kombinieren, können Sie die Funktionalität von Phun nach Belieben neu erstellen.

Toeofdoom
quelle
2

Sehen Sie sich an b2QueryCallback, welche Geräte einen Punkt enthalten, und verwenden Sie b2MouseJointsie, damit Objekte einer Maus folgen. Ich habe einen Beispielcode, aber momentan keine Zeit, ihn für Sie zu vereinfachen. Wenn Sie es brauchen, kann ich es später zur Verfügung stellen.

Colin Gislason
quelle
2

Wenn Sie einen Punkt haben, von dem Sie wissen, dass er sich innerhalb der Form befindet, können Sie die Linie, die die Mausposition mit diesem Punkt verbindet, mit der Grenze der Form schneiden. Wenn es eine ungerade Anzahl von Kreuzungen gibt, befindet sich der Punkt innerhalb. Wenn es eine gerade Anzahl von Kreuzungen gibt, liegt der Punkt außerhalb.

Alt-Text
(Quelle: co.uk )

Die grünen Punkte sind die Mauspositionen, die roten sind der bekannte Punkt innerhalb der Form.

Es gibt Kantenfälle - wenn die Linie, die die Punkte verbindet, beispielsweise mit einer Kante übereinstimmt -, aber dies sollte Sie zu 90% dorthin bringen.

ChrisF
quelle
0

Ich weiß, dass diese Frage alt ist, aber ich habe das Gefühl, dass eine einfache, codebasierte Antwort fehlt. Hier ist es also:

    /// <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;
    }

Beachten Sie, dass dies nicht nur Box2D, sondern Farseer (und in C #) ist, aber genau dieselbe API haben sollte.

Ronen Ness
quelle