2010-07-30 15 views
5

मैं एक गतिशील निकाय बनाने की कोशिश कर रहा हूं जो Box2D में एक स्थिर शरीर के चारों ओर कक्षाओं को बनाता है। मेरे पास शून्य-गुरुत्वाकर्षण दुनिया है, और DistanceJoint जो दो निकायों को जोड़ती है। मैंने सभी घर्षण और निकायों को निकायों और जोड़ों से हटा दिया है, और गतिशील शरीर को प्रारंभिक रैखिक वेग लागू कर रहा हूं। नतीजा यह है कि शरीर कक्षा शुरू होता है, लेकिन इसकी गति समय के साथ कम हो जाती है - जिसे मैं शून्य गुरुत्वाकर्षण वातावरण में घर्षण के बिना उम्मीद नहीं करता हूं।शून्य गुरुत्वाकर्षण बॉक्स 2 डी दुनिया में कम गति

मैं कुछ गलत कर रहा हूं? क्या प्रत्येक चरण में रैखिक वेग को फिर से बनाया जाना चाहिए, या क्या मैं इस काम को Box2D पर सौंप सकता हूं?

// positions of both bodies 

Vector2 planetPosition = new Vector2(x1/Physics.RATIO, y1/Physics.RATIO); 
Vector2 satellitePosition = new Vector2(x2/Physics.RATIO, y2/Physics.RATIO); 


// creating static body 

BodyDef planetBodyDef = new BodyDef(); 
planetBodyDef.type = BodyType.StaticBody; 
planetBodyDef.position.set(planetPosition); 
planetBodyDef.angularDamping = 0; 
planetBodyDef.linearDamping = 0; 

planetBody = _world.createBody(planetBodyDef); 

CircleShape planetShapeDef = new CircleShape(); 
planetShapeDef.setRadius(40); 

FixtureDef planetFixtureDef = new FixtureDef(); 
planetFixtureDef.shape = planetShapeDef; 
planetFixtureDef.density = 0.7f; 
planetFixtureDef.friction = 0; 

planetBody.createFixture(planetFixtureDef); 

// creating dynamic body 

BodyDef satelliteBodyDef = new BodyDef(); 
satelliteBodyDef.type = BodyType.DynamicBody; 
satelliteBodyDef.position.set(satellitePosition); 
satelliteBodyDef.linearDamping = 0; 
satelliteBodyDef.angularDamping = 0; 

satelliteBody = _world.createBody(satelliteBodyDef); 

CircleShape satelliteShapeDef = new CircleShape(); 
satelliteShapeDef.setRadius(10); 

FixtureDef satelliteFixtureDef = new FixtureDef(); 
satelliteFixtureDef.shape = satelliteShapeDef; 
satelliteFixtureDef.density = 0.7f; 
satelliteFixtureDef.friction = 0; 

satelliteBody.createFixture(satelliteFixtureDef); 

// create DistanceJoint between bodies 

DistanceJointDef jointDef = new DistanceJointDef();   
jointDef.initialize(satelliteBody, planetBody, satellitePosition, planetPosition); 
jointDef.collideConnected = false; 
jointDef.dampingRatio = 0; 

_world.createJoint(jointDef); 

// set initial velocity 

satelliteBody.setLinearVelocity(new Vector2(0, 30.0f)); // orthogonal to the joint 

उत्तर

6

शारीरिक रूप से, आप सही हैं:

यहाँ प्रासंगिक कोड है। ऊर्जा के संरक्षण को यह सुनिश्चित करना चाहिए कि शरीर की गति निरंतर बनी रहे।

हालांकि, Box2D भौतिकी का पूरी तरह से प्रतिनिधित्व नहीं कर सकता है। प्रत्येक फ्रेम में एक छोटी सी त्रुटि होगी, और ये त्रुटियां जोड़ती हैं। मुझे नहीं पता कि Box2D जोड़ों को कैसे संभालता है, लेकिन यदि यह किसी सर्कल पर ऑब्जेक्ट की स्थिति को प्रोजेक्ट करता है, तो इससे फ्रेम के दौरान दूरी थोड़ी छोटी हो जाएगी, जो संयुक्त के बिना होती है।

नीचे पंक्ति: यह अपेक्षा करना उचित नहीं है कि गति ठीक उसी तरह बनी रहेगी जैसा आपने शुरू किया था, और आपको क्षतिपूर्ति करने की आवश्यकता होगी। आपकी जरूरतों के आधार पर, आप या तो गति को प्रत्येक फ्रेम मैन्युअल रूप से सेट कर सकते हैं, या शायद एक मोटर के साथ, ग्रह पर लंगर एक विद्रोह संयुक्त का उपयोग कर सकते हैं।

+0

स्पष्टीकरण के लिए धन्यवाद! यह वास्तव में समझ में आता है, जब कोई कंप्यूटर विज्ञान के संदर्भ में इसके बारे में सोचता है, सभी गोल त्रुटियों के साथ ... मुझे लगता है कि मैं बस शुद्ध भौतिकी की उम्मीद कर रहा था :) –

0

रैखिक डैम्पिंग और कोणीय डंपिंग नंबरों की जांच करने और उन्हें शून्य बनाने का प्रयास करें। इससे समस्या हल हो सकती है