Box2D Noktanın Bir Vücudu Kesip Kesmediğini Kontrol Edin


10

Bir noktanın vücuda kesişip kesişmediğini kontrol etmenin bir yolu var mı?

Örneğin, dünyada (100.100) pozisyonunda bir beden olduğunu varsayalım.

(100.100) noktasının bu gövdeyle kesişip kesişmediğini kontrol etmenin bir yolu var mı?

Başka bir örnek "PHUN" adlı oyunla ilgilidir. PHUN'da gövdeleri tıklayıp sürükleyebilirsiniz. Fare noktasının vücudu kesişip kesmediğini nasıl kontrol edersiniz?

Yanıtlar:


5

O zaman nesnelerin listesini alabilirsiniz kapağa tek bir noktasını aabb ayarlarsanız Colin'in cevap olduğu gibi, b2World.Query (), bir işlevdir olabilecek bu noktaya örtüşmektedir. Bununla birlikte, hız endişeleri nedeniyle, sınırlayıcı kutuyu (AABB) yalnızca her zaman tam olarak doğru olmayan bir çakışma için kontrol eder.

Bir armatürü (eski sürümlerde şekil) doğru bir şekilde kontrol etmek için b2Fixture.TestPoint () işlevini kullanın. Bir gövdenin birden fazla fikstürü olabileceğinden, emin olmak için tüm listeyi gözden geçirmeniz gerekebilir. Bu 2 işlevi birleştirmek, isterseniz Phun'un işlevselliğini yeniden oluşturmanıza izin vermelidir.


2

b2QueryCallbackHangi fikstürlerin bir nokta içerdiğini bulmak için bir göz atın ve b2MouseJointnesnelerin bir fareyi izlemesini sağlamak için kullanın . Bazı örnek kod var, ama şu anda sizin için basitleştirmek için zaman yok. İhtiyacınız olursa, daha sonra sağlayabilirim.


2

Şeklin içinde olduğunu bildiğiniz bir noktanız varsa , fare konumunu birleştiren çizgiyi şeklin sınırıyla o noktaya kesebilirsiniz. Tek sayıda kavşak varsa, o zaman nokta içeridedir. Çift sayıda kavşak varsa, o zaman nokta dışarıdadır.

alternatif metin
(kaynak: co.uk )

Yeşil noktalar fare konumları, kırmızı ise şeklin içindeki bilgi noktasıdır.

Örneğin, kenarları birleştiren çizgi bir kenarla çakışıyorsa - kenar kılıfları vardır, ancak bu sizi o yolun% 90'ına götürmelidir.


0

Bu sorunun eski olduğunu biliyorum ama basit, kod tabanlı bir cevap eksik gibi hissediyorum. İşte burada:

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

Bunun düz Box2D değil Farseer (ve C # içinde) olduğunu, ancak tam olarak aynı API'ya sahip olması gerektiğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.