Box2D की जाँच करें अगर प्वाइंट एक शरीर का इरादा रखता है


10

क्या यह जांचने का कोई तरीका है कि कोई बिंदु किसी शरीर को काट रहा है या नहीं?

उदाहरण के लिए, यह बताता है कि (100,100) की स्थिति में दुनिया में एक निकाय है।

क्या यह जांचने का कोई तरीका है कि क्या कोई बिंदु (100,100) उस शरीर को काटता है?

एक अन्य उदाहरण "PHUN" नामक गेम से संबंधित है। PHUN में आप निकायों को चारों ओर क्लिक और खींच सकते हैं। अगर एक माउस बिंदु एक शरीर को काट रहा है तो आप कैसे जांचेंगे?

जवाबों:


5

कॉलिन के उत्तर के रूप में, b2World.Query () एक उपयोगी कार्य है, यदि आप aabb को केवल एक बिंदु को कवर करने के लिए सेट करते हैं तो आप उन वस्तुओं की एक सूची प्राप्त कर सकते हैं जो उस बिंदु को ओवरलैप कर सकती हैं। हालाँकि, गति संबंधी चिंताओं के कारण यह केवल एक ओवरलैप के लिए बाउंडिंग बॉक्स (AABB) की जांच करता है जो हमेशा पूरी तरह से सही नहीं होता है।

एक स्थिरता (आकार, पुराने संस्करणों में) की जांच करने के लिए, b2Fixture.TestPoint () फ़ंक्शन का उपयोग करें। जैसा कि एक शरीर में कई जुड़नार हो सकते हैं, आपको सुनिश्चित करने के लिए पूरी सूची के माध्यम से लूप की आवश्यकता हो सकती है। यदि आप चाहें तो उन 2 कार्यों के संयोजन से आपको फ्यून की कार्यक्षमता को फिर से बनाने की अनुमति मिल सकती है।


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 # में), लेकिन इसमें ठीक उसी एपीआई होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.