Box2D ตรวจสอบว่าจุดตัดร่างกายหรือไม่


10

มีวิธีตรวจสอบหรือไม่ว่ามีจุดใดจุดหนึ่งตัดกันร่างกายหรือไม่?

ตัวอย่างเช่นสมมติว่ามีร่างกายในโลกที่ตำแหน่ง (100,100)

มีวิธีตรวจสอบว่ามีจุดที่ (100,100) ตัดกันร่างกายนั้นหรือไม่?

อีกตัวอย่างหนึ่งเกี่ยวข้องกับเกมที่ชื่อว่า "PHUN" ใน PHUN คุณสามารถคลิกและลากไปมาได้ คุณจะตรวจสอบได้อย่างไรว่าจุดเมาส์กำลังตัดกันร่างกายหรือไม่?

คำตอบ:


5

เช่นเดียวกับคำตอบของ colin, b2World.Query () เป็นฟังก์ชั่นที่มีประโยชน์ถ้าคุณตั้งค่า aabb ให้ครอบคลุมเฉพาะจุดเดียวคุณจะได้รับรายการของวัตถุที่ อาจทับซ้อนกับจุดนั้น อย่างไรก็ตามเนื่องจากความกังวลเรื่องความเร็วจึงตรวจสอบเฉพาะกล่องขอบ (AABB) สำหรับการทับซ้อนซึ่งไม่แม่นยำเสมอไป

ในการตรวจสอบฟิกซ์เจอร์ (รูปร่างในเวอร์ชันเก่า) อย่างถูกต้องให้ใช้ฟังก์ชัน b2Fixture.TestPoint () เนื่องจากร่างกายสามารถติดตั้งได้หลายตัวคุณอาจต้องวนดูรายการทั้งหมดเพื่อให้แน่ใจ การรวมฟังก์ชั่นทั้งสองนั้นจะช่วยให้คุณสามารถสร้างฟังก์ชั่นการทำงานของพุนได้หากต้องการ


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.