Box2D Перевірте, чи точка перетинає тіло


10

Чи є спосіб перевірити, чи точка перетинає тіло?

Наприклад, скажімо, що у світі є тіло в положенні (100 100).

Чи є спосіб перевірити, чи точка (100 100) перетинає це тіло?

Ще один приклад пов’язаний з грою під назвою "PHUN". У PHUN можна клацнути та перетягувати тіла. Як би ви перевірили, чи точка миші перетинається з тілом?

Відповіді:


5

Як і у відповіді colin, b2World.Query () - корисна функція, якщо ви встановите aabb на покриття лише однієї точки, то ви можете отримати список об'єктів, які можуть перекривати цю точку. Однак через проблеми швидкості він перевіряє лише обмежувальний ящик (AABB) на наявність перекриття, яке не завжди є абсолютно точним.

Щоб точно перевірити кріплення (форму, у більш старих версіях), використовуйте функцію b2Fixture.TestPoint (). Оскільки корпус може мати кілька світильників, вам, можливо, знадобиться прокрутити весь список, щоб бути впевненим. Поєднання цих двох функцій повинно дозволяти відтворити функціональність Phun, якщо вам це подобається.


2

Погляньте на b2QueryCallbackпошук того, які світильники містять крапку, і використовуйте b2MouseJointдля того, щоб об’єкти слідкували за мишкою. У мене є зразок коду, але зараз немає часу спростити його для вас. Якщо вам це потрібно, я можу надати його пізніше.


2

Якщо у вас є точка, яку ви знаєте, знаходиться всередині форми, ви можете перетинати лінію, що з'єднує місце миші до цієї точки, з межею фігури. Якщо є непарна кількість перетинів, то точка знаходиться всередині. Якщо є парне число перехресть, то точка знаходиться поза.

alt текст
(джерело: 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.