점이 바디와 교차하는지 Box2D 확인


10

포인트가 바디를 교차하는지 확인하는 방법이 있습니까?

예를 들어, 세계에 (100,100)의 위치에 시체가 있다고 가정 해 봅시다.

(100,100)의 점이 그 몸과 교차하는지 확인하는 방법이 있습니까?

또 다른 예는 "PHUN"이라는 게임과 관련이 있습니다. PHUN에서는 바디를 클릭하고 드래그 할 수 있습니다. 마우스 포인트가 바디와 교차하는지 어떻게 확인합니까?

답변:


5

콜린의 대답과 마찬가지로 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를 가져야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.