Снижение скорости в мире невесомости box2d - PullRequest
5 голосов
/ 31 июля 2010

Я пытаюсь создать динамическое тело, которое вращается вокруг статического тела в Box2D. У меня есть мир невесомости и DistanceJoint, который соединяет два тела. Я удалил все трения и демпфирование с тел и сустава и применяю начальную линейную скорость к динамическому телу. В результате тело начинает вращаться, но его скорость со временем уменьшается, чего я не ожидаю в условиях невесомости без трения.

Я что-то не так делаю? Следует ли воссоздавать линейную скорость на каждом шаге или я могу делегировать эту работу 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

Ответы [ 2 ]

6 голосов
/ 12 августа 2010

Физически вы правы.Сохранение энергии должно гарантировать, что скорость тела остается постоянной.

Однако Box2D не может в полной мере представить физику.В каждом кадре будет небольшая ошибка, и эти ошибки складываются.Я не знаю, как Box2D обрабатывает соединения, но если он проецирует положение объекта на окружность, это приведет к тому, что расстояние, пройденное за кадр, будет немного меньше, чем было бы без соединения.

Bottomлиния: не стоит ожидать, что скорость останется точно такой же, как вы начали, и вам нужно будет компенсировать это.В зависимости от ваших потребностей, вы можете либо устанавливать скорость вручную в каждом кадре, либо использовать вращающееся соединение, закрепленное на планете с мотором.

0 голосов
/ 04 октября 2011

попробуйте проверить числа linearDamping и angularDamping и обнулить их.Это может решить проблему

...