Box2D Verifica se il punto interseca un corpo


10

C'è un modo per verificare se un punto interseca un corpo?

Ad esempio, supponiamo che ci sia un corpo nel mondo in una posizione di (100.100).

C'è un modo per verificare se un punto a (100.100) interseca quel corpo?

Un altro esempio è legato a un gioco chiamato "PHUN". In PHUN puoi fare clic e trascinare i corpi in giro. Come verifichi se un punto del mouse interseca un corpo?

Risposte:


5

Come per la risposta di Colin, b2World.Query () è una funzione utile, se si imposta aabb per coprire solo un singolo punto, è possibile ottenere un elenco di oggetti che potrebbero sovrapporsi a quel punto. Tuttavia, a causa di problemi di velocità, controlla solo il riquadro di delimitazione (AABB) per una sovrapposizione che non è sempre del tutto accurata.

Per controllare accuratamente un dispositivo (forma, nelle versioni precedenti), utilizzare la funzione b2Fixture.TestPoint (). Poiché un corpo può avere più dispositivi, potrebbe essere necessario scorrere l'intero elenco per essere sicuri. La combinazione di queste 2 funzioni dovrebbe consentire di ricreare la funzionalità di Phun, se lo si desidera.


2

Dai un'occhiata b2QueryCallbackper trovare quali dispositivi contengono un punto e utilizzali b2MouseJointper fare in modo che gli oggetti seguano un mouse. Ho del codice di esempio, ma non ho tempo di semplificarlo per te in questo momento. Se ne hai bisogno, posso fornirlo in seguito.


2

Se hai un punto che sai che si trova all'interno della forma, puoi intersecare la linea che unisce la posizione del mouse a quel punto con il bordo della forma. Se è presente un numero dispari di intersezioni, il punto è all'interno. Se esiste un numero pari di intersezioni, il punto è esterno.

testo alternativo
(fonte: co.uk )

I punti verdi sono le posizioni del mouse, il rosso è il punto noto all'interno della forma.

Ci sono casi limite - se la linea che unisce i punti coincide con un bordo, ad esempio - ma questo dovrebbe farti arrivare il 90% del percorso.


0

So che questa domanda è vecchia ma mi sembra che manchi una risposta semplice, basata su codice. Quindi eccolo qui:

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

Si noti che questo non è semplice Box2D ma Farseer (e in C #), ma dovrebbe avere esattamente la stessa API.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.