Box2D Verifique se o ponto cruza um corpo

10

Existe uma maneira de verificar se um ponto está cruzando um corpo?

Por exemplo, digamos que exista um corpo no mundo em uma posição de (100.100).

Existe uma maneira de verificar se um ponto em (100,100) cruza esse corpo?

Outro exemplo está relacionado a um jogo chamado "PHUN". No PHUN, você pode clicar e arrastar os corpos. Como você verificaria se um ponto do mouse está cruzando um corpo?

xAustechx
fonte

Respostas:

5

Como na resposta de colin, b2World.Query () é uma função útil, se você definir o aabb para cobrir apenas um único ponto, poderá obter uma lista de objetos que podem se sobrepor a esse ponto. No entanto, devido a preocupações com a velocidade, verifica apenas a caixa delimitadora (AABB) quanto a uma sobreposição que nem sempre é totalmente precisa.

Para verificar com precisão um acessório (forma, em versões mais antigas), use a função b2Fixture.TestPoint (). Como um corpo pode ter vários equipamentos, pode ser necessário percorrer a lista inteira para ter certeza. A combinação dessas 2 funções deve permitir que você recrie a funcionalidade do Phun, se quiser.

Toeofdoom
fonte
2

Dê uma olhada b2QueryCallbackpara descobrir quais acessórios contêm um ponto e use b2MouseJointpara fazer com que os objetos sigam o mouse. Eu tenho um código de exemplo, mas não há tempo para simplificá-lo agora. Se você precisar, eu posso fornecê-lo mais tarde.

Colin Gislason
fonte
2

Se você tem um ponto que você sabe que está dentro da forma, é possível cruzar a linha que une a localização do mouse a esse ponto com o limite da forma. Se houver um número ímpar de interseções, o ponto estará dentro. Se houver um número par de interseções, o ponto estará fora.

texto alternativo
(fonte: co.uk )

Os pontos verdes são os locais do mouse, o vermelho é o ponto de conhecimento dentro da forma.

Existem casos de arestas - se a linha que une os pontos coincide com uma aresta, por exemplo -, mas isso deve levar você a 90% do caminho até lá.

ChrisF
fonte
0

Sei que essa pergunta é antiga, mas sinto que falta uma resposta simples e baseada em código. Então aqui está:

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

Observe que isso não é simples Box2D, mas Farseer (e em C #), mas deve ter exatamente a mesma API.

Ronen Ness
fonte