2010-07-30 22 views
5

Tôi đang cố gắng tạo ra một cơ thể động quay xung quanh một thân tĩnh trong Box2D. Tôi có một thế giới không trọng lực và DistanceJoint kết nối hai vật thể. Tôi đã loại bỏ tất cả ma sát và giảm chấn từ các cơ quan và khớp, và đang áp dụng một vận tốc tuyến tính ban đầu cho cơ thể động. Kết quả là cơ thể bắt đầu quay quanh, nhưng vận tốc của nó giảm đi theo thời gian - mà tôi không mong đợi trong một môi trường trọng lực bằng không mà không có ma sát.Tốc độ giảm dần trong không trọng lực box2d thế giới

Tôi có làm gì sai không? Nếu tốc độ tuyến tính được tái tạo ở mỗi bước, hoặc tôi có thể giao công việc này cho Box2D?

Đây là mã có liên quan:

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

Trả lời

6

Thể chất, bạn là chính xác. Bảo tồn năng lượng phải đảm bảo rằng tốc độ của cơ thể vẫn không đổi.

Tuy nhiên, Box2D không thể đại diện cho vật lý một cách hoàn hảo. Sẽ có một lỗi nhỏ trong mỗi khung và các lỗi này sẽ tăng lên. Tôi không biết làm thế nào Box2D xử lý khớp, nhưng nếu nó dự án vị trí của đối tượng vào một vòng tròn, điều này sẽ gây ra khoảng cách đi trong một khung nhỏ hơn một chút so với nó sẽ không có khớp.

Dòng dưới cùng: không hợp lý để mong đợi tốc độ giữ nguyên chính xác như những gì bạn đã bắt đầu và bạn sẽ cần phải bù lại. Tùy thuộc vào nhu cầu của bạn, bạn có thể thiết lập vận tốc bằng tay mỗi khung hình, hoặc có thể sử dụng khớp nối nổi, được neo trên hành tinh, với một động cơ.

+0

cảm ơn bạn đã giải thích! nó thực sự có ý nghĩa, khi người ta nghĩ về nó về khoa học máy tính, với tất cả các lỗi làm tròn ... Tôi đoán tôi chỉ đơn giản là mong đợi vật lý thuần túy :) –

0

thử kiểm tra các con số tuyến tínhĐèn trượt và góc nghiêng và làm cho chúng bằng không. Điều đó có thể giải quyết vấn đề

Các vấn đề liên quan