2016-08-27 34 views
0

我想了解我需要移動我的對象的力量。這是我的世界是怎樣的設置和物理一步完成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); 
    } 
} 

所以我有一個1x1的盒子具有密度1重力設定爲-9.8和我期待的是,當我申請量對我的箱子的力大於重力(在這個例子中我已經設置爲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意味着所需高度的一半,所以您的盒子的質量爲4,而不是1。所以,如果你想有一個盒子1×1,你會打電話給setAsBox(0.5F, 0.5F)

但是這並不能解釋爲什麼你需要80的力量來移動它,因爲50的力量應該足以產生影響。

Fg = m * g = 9.8 * 4 = 39.2

在質量上4的對象我的測試項目,即使應用程序(應用程序啓動的延遲,按下按鈕顯著所以我儘量避免吧)40力是顯着的。

+0

哦,我錯過了setAsBox是一半/高度。經過糾正和多一點測試後,我注意到我需要的力量恰好是我期待的2倍,並意識到這是因爲我意外地調用了world.step()已經在其他地方了... – user1531605