Box2D Verifica si el punto intersecta un cuerpo

10

¿Hay alguna manera de verificar si un punto se cruza con un cuerpo?

Por ejemplo, digamos que hay un cuerpo en el mundo en una posición de (100,100).

¿Hay alguna manera de verificar si un punto en (100,100) se cruza con ese cuerpo?

Otro ejemplo está relacionado con un juego llamado "PHUN". En PHUN puedes hacer clic y arrastrar cuerpos alrededor. ¿Cómo comprobarías si un punto del mouse se cruza con un cuerpo?

xAustechx
fuente

Respuestas:

5

Al igual que con la respuesta de Colin, b2World.Query () es una función útil, si configura el aabb para cubrir solo un punto, puede obtener una lista de objetos que pueden superponerse a ese punto. Sin embargo, debido a problemas de velocidad, solo verifica el cuadro delimitador (AABB) para una superposición que no siempre es del todo precisa.

Para verificar con precisión un dispositivo (forma, en versiones anteriores), use la función b2Fixture.TestPoint (). Como un cuerpo puede tener múltiples accesorios, es posible que deba recorrer toda la lista para asegurarse. La combinación de esas 2 funciones debería permitirle recrear la funcionalidad de Phun, si lo desea.

Toeofdoom
fuente
2

Eche un vistazo b2QueryCallbackpara encontrar qué dispositivos contienen un punto y usar b2MouseJointpara que los objetos sigan a un mouse. Tengo un código de muestra, pero no tengo tiempo para simplificarlo en este momento. Si lo necesita, puedo proporcionarlo más tarde.

Colin Gislason
fuente
2

Si tiene un punto que sabe que está dentro de la forma, puede intersecar la línea que une la ubicación del mouse a ese punto con el límite de la forma. Si hay un número impar de intersecciones, entonces el punto está adentro. Si hay un número par de intersecciones, entonces el punto está afuera.

texto alternativo
(fuente: co.uk )

Los puntos verdes son las ubicaciones del mouse, el rojo es el punto de conocimiento dentro de la forma.

Hay casos de borde, si la línea que une los puntos coincide con un borde, por ejemplo, pero esto debería llevarlo al 90% del camino.

ChrisF
fuente
0

Sé que esta pregunta es antigua, pero siento que le falta una respuesta simple basada en código. Asi que aqui esta:

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

Tenga en cuenta que esto no es Box2D simple sino Farseer (y en C #), pero debe tener exactamente la misma API.

Ronen Ness
fuente