Box2D - падающее тело не ускоряется под действием силы тяжести - PullRequest
2 голосов
/ 23 января 2012

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

public PhysicsWorld() {
    // Step 1: Create Physics World Boundaries
    Vec2 gravity = new Vec2(0, 20);
    boolean doSleep = true;
    world = new World(gravity, doSleep);

    // Dynamic Body
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyType.DYNAMIC;
    bodyDef.position.set(100, 100);
    body = world.createBody(bodyDef);
    MassData md = new MassData();
    md.mass = 5;
    body.setMassData(md);
    PolygonShape dynamicBox = new PolygonShape();
    dynamicBox.setAsBox(1, 1);
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = dynamicBox;
    fixtureDef.density = 1;
    fixtureDef.friction = 0.3f;
    body.createFixture(fixtureDef);

    velocityIterations = 6;
    positionIterations = 2;

}

public void update() {
    world.step(timeStep, velocityIterations, positionIterations);
    Log.i("body", "x: " + body.getPosition().x + " y: " + body.getPosition().y);
}

Выход:

01-22 21:17:20.750: I/body(7698): x: 100.0 y: 102.0
01-22 21:17:20.777: I/body(7698): x: 100.0 y: 104.0
01-22 21:17:20.796: I/body(7698): x: 100.0 y: 106.0
01-22 21:17:20.824: I/body(7698): x: 100.0 y: 108.0
01-22 21:17:20.847: I/body(7698): x: 100.0 y: 110.0

Я ожидаю, что гравитация будет применена на каждой итерации и увеличит скорость шариков в Y.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Это потому, что скорость ограничена двигателем, а вы не используете правильные мировые координаты. Думайте об этом как о системе метра-килограмма-секунды. У вас есть коробка размером 1 на 1 метр, падающая со скоростью 2 метра за 1/40 секунды или 80 метров за секунду. Это довольно быстро.

0 голосов
/ 03 февраля 2012

http://www.iforce2d.net/b2dtut/gotchas#speedlimit

Если ваша частота кадров составляет 40 кадров в секунду, timeStep обычно будет 1 / 40.0f

...