Box2D检查点是否与物体相交


10

有没有办法检查一个点是否与物体相交?

例如,假设世界上有一个身体处于(100,100)的位置。

有没有办法检查(100,100)点是否与该物体相交?

另一个示例与名为“ PHUN”的游戏有关。在PHUN中,您可以单击并拖动身体。您如何检查鼠标点是否与身体相交?

Answers:


5

与colin的答案一样,b2World.Query()是一个有用的函数,如果将aabb设置为仅覆盖单个点,则可以获得可能与该点重叠的对象列表。但是,由于速度方面的考虑,它只检查边界框(AABB)是否存在重叠,但重叠并不总是完全准确的。

要准确检查固定装置(旧版本中的形状),请使用b2Fixture.TestPoint()函数。由于一个主体可以具有多个固定装置,因此您可能需要遍历整个列表以确保。如果愿意,将这两个功能组合在一起可以使您重新创建Phun的功能。


2

看一下b2QueryCallback查找哪些固定装置包含一个点并b2MouseJoint用于使对象跟随鼠标。我有一些示例代码,但现在没有时间为您简化它。如果您需要它,我可以稍后提供。


2

如果你有一点认识是里面的造型,那么你可以相交线与形的边界加入了鼠标的位置这一点。如果交叉点数量奇数,则该点在内部。如果有偶数个交点,则该点在外面。

替代文字
(来源:co.uk

绿点是鼠标位置,红色是形状内的已知点。

有边的情况-例如,如果连接点的线与边重合-但这应该可以让您90%地到达边。


0

我知道这个问题很旧,但是我觉得它缺少一个简单的基于代码的答案。所以这里是:

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

请注意,这不是普通的Box2D,而是Farseer(和C#),但它应该具有完全相同的API。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.