Box2D Periksa Jika Titik Memotong Tubuh

10

Apakah ada cara untuk memeriksa apakah suatu titik memotong suatu benda?

Sebagai contoh, katakanlah ada tubuh di dunia pada posisi (100.100).

Apakah ada cara untuk memeriksa apakah suatu titik di (100.100) berpotongan badan itu?

Contoh lain terkait dengan permainan yang disebut "PHUN". Di PHUN Anda dapat mengklik dan menyeret badan di sekitar. Bagaimana Anda memeriksa jika titik mouse memotong badan?

xAustechx
sumber

Jawaban:

5

Seperti jawaban colin, b2World.Query () adalah fungsi yang berguna, jika Anda mengatur aabb untuk hanya mencakup satu titik maka Anda bisa mendapatkan daftar objek yang mungkin tumpang tindih dengan titik itu. Namun, karena masalah kecepatan itu hanya memeriksa kotak pembatas (AABB) untuk tumpang tindih yang tidak selalu sepenuhnya akurat.

Untuk memeriksa fixture (bentuk, dalam versi yang lebih lama) secara akurat, gunakan fungsi b2Fixture.TestPoint (). Karena sebuah body dapat memiliki beberapa fixture, Anda mungkin perlu mengulang seluruh daftar untuk memastikan. Menggabungkan kedua fungsi itu akan memungkinkan Anda untuk membuat ulang fungsionalitas Phun, jika Anda mau.

Toeofdoom
sumber
2

Lihatlah b2QueryCallbackuntuk menemukan perlengkapan apa yang mengandung titik dan gunakan b2MouseJointuntuk memiliki benda mengikuti mouse. Saya memiliki beberapa kode sampel, tetapi tidak ada waktu untuk menyederhanakannya untuk Anda saat ini. Jika Anda membutuhkannya, saya bisa memberikannya nanti.

Colin Gislason
sumber
2

Jika Anda memiliki titik yang Anda tahu ada di dalam bentuk maka Anda dapat memotong garis yang menghubungkan lokasi mouse ke titik itu dengan batas bentuk. Jika ada jumlah ganjil persimpangan maka intinya ada di dalam. Jika ada jumlah simpang genap maka intinya ada di luar.

teks alternatif
(sumber: co.uk )

Titik-titik hijau adalah lokasi mouse, merah adalah titik tahu di dalam bentuk.

Ada kasus tepi - jika garis yang menghubungkan titik bertepatan dengan tepi, misalnya - tetapi ini akan membuat Anda 90% dari perjalanan ke sana.

ChrisF
sumber
0

Saya tahu pertanyaan ini sudah lama tetapi saya merasa tidak ada jawaban yang sederhana dan berbasis kode. Jadi begini:

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

Perhatikan bahwa ini bukan Box2D biasa tetapi Farseer (dan dalam C #), tetapi harus memiliki API yang sama persis.

Ronen Ness
sumber