Box2D Vérifier si le point intersecte un corps

10

Existe-t-il un moyen de vérifier si un point coupe un corps?

Par exemple, disons qu'il y a un corps dans le monde à une position de (100,100).

Existe-t-il un moyen de vérifier si un point à (100,100) coupe ce corps?

Un autre exemple concerne un jeu appelé "PHUN". Dans PHUN, vous pouvez cliquer et faire glisser les corps. Comment vérifieriez-vous si un point de souris coupe un corps?

xAustechx
la source

Réponses:

5

Comme pour la réponse de colin, b2World.Query () est une fonction utile, si vous définissez l'aabb pour ne couvrir qu'un seul point, vous pouvez obtenir une liste d'objets pouvant chevaucher ce point. Cependant, en raison de problèmes de vitesse, il ne vérifie que la zone de délimitation (AABB) pour un chevauchement qui n'est pas toujours entièrement précis.

Pour vérifier avec précision un luminaire (forme, dans les anciennes versions), utilisez la fonction b2Fixture.TestPoint (). Comme un corps peut avoir plusieurs appareils, vous devrez peut-être parcourir la liste entière pour être sûr. La combinaison de ces 2 fonctions devrait vous permettre de recréer les fonctionnalités de Phun, si vous le souhaitez.

Toeofdoom
la source
2

Jetez un œil b2QueryCallbackpour trouver quels appareils contiennent un point et utilisez b2MouseJointpour que les objets suivent une souris. J'ai un exemple de code, mais pas le temps de le simplifier pour vous en ce moment. Si vous en avez besoin, je pourrai vous le fournir plus tard.

Colin Gislason
la source
2

Si vous avez un point que vous savez être à l'intérieur de la forme, vous pouvez couper la ligne joignant l'emplacement de la souris à ce point avec la limite de la forme. S'il y a un nombre impair d'intersections, le point est à l'intérieur. S'il y a un nombre pair d'intersections, le point est à l'extérieur.

texte alternatif
(source: co.uk )

Les points verts sont les emplacements de la souris, le rouge est le point connu à l'intérieur de la forme.

Il y a des cas d'arête - si la ligne joignant les points coïncide avec une arête, par exemple - mais cela devrait vous y conduire à 90%.

ChrisF
la source
0

Je sais que cette question est ancienne mais j'ai l'impression qu'il manque une réponse simple basée sur le code. Voici donc:

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

Notez qu'il ne s'agit pas de Box2D mais de Farseer (et en C #), mais il devrait avoir exactement la même API.

Ronen Ness
la source