2016-08-27 7 views
0

私は私のオブジェクトを移動するために必要な力の量を理解しようとしています。これは私の世界は、セットアップで、物理学のステップは、だから私は1重力が-9.8に設定されている密度の1x1のボックスを持っていると私は、私は量を適用するときにすることを期待していBox2D。どのくらいの力が必要であるかを理解しようとしています

private void setupWorld() { 
    mWorld = new World(new Vector2(0f, -9.8f), true); 

    BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = BodyDef.BodyType.DynamicBody; 
    bodyDef.position.set(x, y); 

    body = world.createBody(bodyDef); 

    PolygonShape box=new PolygonShape(); 
    box.setAsBox(1,1); 

    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.shape = box; 
    fixtureDef.density = 1f; 
    fixtureDef.friction = 0.0f; 
    fixtureDef.restitution = 0.0f; 

    Fixture fixture = body.createFixture(fixtureDef); 
    box.dispose(); 
} 

private void doPhysicsStep(float deltaTime) { 
    float frameTime = Math.min(deltaTime, 0.25f); 
    accumulator += frameTime; 
    while (accumulator >= TIME_STEP) { 
     body.applyForceToCenter(new Vector2(0, 10f), true); 
     world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS); 
     accumulator -= (TIME_STEP); 
    } 
} 

を行う方法であります(この例では10に設定しました)ボックスが重力よりも大きくなるようにしてください。

しかし、ボックスは移動しません。ボックスを移動する前に力を約80(つまり、body.applyForceToCenter(new Vector2(0, 80f), true);)に設定する必要があります。

私はこれが私のタイムステップ(私は現在1/60fに設定されている)に起因すると考えましたが、それを考慮に入れて何かが私が各ステップで適用している力を減らすならば。

ここで誤算していることを誰かが説明できますか?

+0

あなたはまったく動かないのですか?たぶん、それはちょうど非常にゆっくりと動いています。 10の力は、加速のために0.2が残されていることを意味する。これは、毎秒0.2単位で速度が増加することを意味します。スケールに応じて、これは非常に遅いかもしれません。 –

答えて

1

方法ではsetAsBox(float hx, float hy)hxは希望の幅の半分を意味し、hyは希望の高さの半分を意味するため、ボックスの質量は1ではなく4です。だから1x1の箱を持っていたい場合はsetAsBox(0.5F, 0.5F)と呼ぶでしょう。

しかし、これは、移動に80の力が必要な理由を説明していません。なぜなら、50の力が違いを生むのに十分なはずだからです。マス4のオブジェクト上の私のテストプロジェクトで

Fg = m * g = 9.8 * 4 = 39.2

(私はそれを避けるためのアプリケーション開始し、ボタンを押すの遅れが重要である)、プログラム適用時に40のにも力が顕著です。

+0

ああ、私はsetAsBoxを忘れていた/高さの半分だった。それを訂正してもう少しテストをしたところ、2倍の力が必要だったことに気がつきました。私は誤ってworld.step()を既に別の場所に呼び出していたからです。 – user1531605

関連する問題