2011-05-29 14 views
20

मेरे पास एक बी 2 बॉडी है जिसे मैं एक निश्चित लक्ष्य स्थिति पर ले जाना चाहता हूं। मैं SetPosition फ़ंक्शन का उपयोग नहीं करना चाहता हूं। मैं इसे कैसे प्राप्त कर सकता हूं:शरीर को एक विशिष्ट स्थिति में ले जाएं - Box2D

  1. रैखिक वेग बदलना।
  2. माउसजॉइंट का उपयोग करना। (लक्ष्य स्थिति तय की गई है। माउस शामिल नहीं है।)

मैं Box2DAS3 2.1a का उपयोग कर रहा हूं। किसी भी अन्य भाषा में मदद की भी सराहना की जाएगी।

+0

क्या आपका मतलब यह है कि यह एक स्थान पर लगी हुई है और आप इसे चारों ओर ले जाना चाहते हैं या आप इसे किसी निश्चित स्थान पर ले जाना चाहते हैं और फिर वहां रहना चाहते हैं? कृपया किसी भी मामले में विस्तृत करें। – Shannon

उत्तर

41

सबसे आसान तरीका वास्तव में SetPosition/SetTransform(position,angle) का उपयोग करना है। उदाहरण के लिए:

body->SetTransform(b2Vec2(0,0),body->GetAngle()) 

जाहिर है, तात्कालिक कूद मतलब है कि आप भौतिकी सिमुलेशन को नष्ट कर रहे हैं लेकिन यह एक शरीर की स्थिति सेट करने का सबसे सरल सबसे सीधा रास्ता है।

यह देखते हुए कि आप SetPosition (जो ऊपर पोस्ट किए गए कोड के बराबर है) का उपयोग नहीं करना चाहते हैं, तो उपयुक्त बल (शरीर की मास और वर्तमान गति के आधार पर) ApplyLinearImpulse चाल चलाना होगा, और अधिक सिमुलेशन पॉइंट-ऑफ-व्यू से सही, लेकिन संभावित साइड इफेक्ट्स इत्यादि से अधिक समस्याग्रस्त होने की संभावना है।

वैसे भी, iforce2d SetLinearVelocity कवर किया गया ..., और मैं जोड़ता हूं कि एक माउस जोड़ भी बहुत उपयोगी होता है "माउस" शामिल नहीं है।

+1

धन्यवाद, बॉडी-> SetTransform (b2Vec2 (0,0), body-> GetAngle()) ने मेरे लिए यह किया ... –

+0

यह सही है, धन्यवाद। –

+0

मैं इसे लागू करने के बाद एनीमेशन क्यों नहीं देख सकता? यह 'सेटपोजिशन' जैसी निर्धारित स्थिति पर दिखाई देता है – TomSawyer

19

शरीर का रैखिक वेग निर्धारित करने का सबसे आसान तरीका यह होगा कि यह एक समय में आवश्यक दूरी को कवर करेगा। जैसे। यदि शरीर को वांछित स्थान पर जाने के लिए (2,3) इकाइयों को स्थानांतरित करने की आवश्यकता है और आपका टाइमस्टेप 60 हर्ट्ज है तो आप एक समय के लिए SetLinearVelocity (120,180) कर सकते हैं। अगली बार कदम में आपको निश्चित रूप से दूरी को उड़ने से रोकने के लिए वेग को शून्य पर सेट करना होगा। इसका परिणाम बहुत अलग नहीं है यदि आपने सेटट्रांसफॉर्म का उपयोग किया था, सिवाय इसके कि सीसीडी काम करेगी और अगर कुछ भी रास्ते में है तो उसे फटकारा जाएगा।

यदि आप नहीं चाहते हैं कि शरीर एक समय में पहुंचने के लिए, बस अधिकतम गति को सीमित कर दें।

यदि आप बजाय ApplyForce/ApplyLinearImpulse का उपयोग करेंगे, तो आप कुछ ऐसा ही कर सकते हैं लेकिन आपको शरीर की वर्तमान गति को भी ध्यान में रखना होगा। आपको यह पृष्ठ उपयोगी हो सकता है, यह इसके घूर्णन संस्करण को समझाता है लेकिन सिद्धांत समान है: http://www.iforce2d.net/b2dtut/rotate-to-angle

संबंधित मुद्दे