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
4

2 に答える 2

6

物理的には、あなたは正しいです。エネルギー保存は、体の速度が一定に保たれるようにする必要があります。

ただし、Box2Dは物理を完全に表すことはできません。すべてのフレームで小さなエラーが発生し、これらのエラーが合計されます。Box2Dがジョイントをどのように処理するかはわかりませんが、オブジェクトの位置を円に投影すると、フレーム内の移動距離がジョイントなしの場合よりもわずかに短くなります。

結論:速度が最初とまったく同じであると期待するのは合理的ではなく、補償する必要があります。必要に応じて、フレームごとに手動で速度を設定するか、モーターを使用して惑星に固定された回転ジョイントを使用することができます。

于 2010-08-12T15:56:19.770 に答える
0

linearDampingとangularDampingの数値を確認し、それらをゼロにしてみてください。それは問題を解決するかもしれません

于 2011-10-04T13:35:23.580 に答える