【问题标题】:Missing gravity in box2d libgdxbox2d libgdx中缺少重力
【发布时间】:2014-04-12 09:30:24
【问题描述】:

我正在尝试在 libgdx 中使用 box2d 制作示例。

我希望球在 box2d 世界中随重力下落。现在它下降但没有加速度(我看到球以加速度=0下降)。我尝试添加阻尼、密度……但没有任何变化。请帮我找出我的错。非常感谢。
这是此问题的视频:youtube.com/watch?v=NkbcVMsB2S0
;在此视频中,您可以看到圆圈以加速度 = 0 下降。我试图改变一些参数,但看起来加速度总是为零。 这是一个简单的类:

public class MyGdxGame implements ApplicationListener, InputProcessor {
World world;
Box2DDebugRenderer debugRenderer;
OrthographicCamera camera;
static final float BOX_STEP = 1 / 45f;
static final int BOX_VELOCITY_ITERATIONS = 6;
static final int BOX_POSITION_ITERATIONS = 2;
static final float WORLD_TO_BOX = 0.01f;
static final float BOX_WORLD_TO = 100f;

private int counter = 100;
private Body body;

@Override
public void create() {
    world = new World(new Vector2(0, -200f), false);
    world.setContinuousPhysics(true);
    camera = new OrthographicCamera();
    camera.viewportHeight = 320;
    camera.viewportWidth = 480;
    camera.position.set(camera.viewportWidth * .5f,
            camera.viewportHeight * .5f, 0f);
    camera.update();
    // Ground body
    BodyDef groundBodyDef = new BodyDef();
    groundBodyDef.position.set(new Vector2(0, 10));
    Body groundBody = world.createBody(groundBodyDef);
    PolygonShape groundBox = new PolygonShape();
    groundBody.createFixture(groundBox, 0.0f);
    // Dynamic Body
    BodyDef bodyDef = new BodyDef();
    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(camera.viewportWidth / 2, camera.viewportHeight);
    bodyDef.angularDamping = 0.01f;
    bodyDef.linearDamping = 0.0f;
    body = world.createBody(bodyDef);
    CircleShape dynamicCircle = new CircleShape();
    dynamicCircle.setRadius(10f);
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = dynamicCircle;
    fixtureDef.density = 10.0f;
    fixtureDef.friction = 0.0f;
    fixtureDef.restitution = 0f;
    body.createFixture(fixtureDef);
    MassData massData = new MassData();
    massData.mass = 50f;
    body.setMassData(massData);
    body.setGravityScale(1f);
    debugRenderer = new Box2DDebugRenderer();
    Gdx.input.setInputProcessor(this);
}

@Override
public void dispose() {
}

@Override
public void render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    if (counter < 10) {
        body.applyForceToCenter(0, 200000f, true);
    }
    counter++;
    debugRenderer.render(world, camera.combined);
    world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);
}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

@Override
public boolean keyDown(int keycode) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean keyUp(int keycode) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean keyTyped(char character) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    counter = 0;
    return false;
}

@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    return false;
}

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean mouseMoved(int screenX, int screenY) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean scrolled(int amount) {
    // TODO Auto-generated method stub
    return false;
}

【问题讨论】:

  • 我不明白你的问题。你想让它掉下来还是不掉下来?它会掉还是不会掉?
  • 抱歉我的问题不清楚。我希望球在重力下落下。现在它下落但没有重力(我看到球以加速度 =0 下落)
  • 我不明白,在world = new World(new Vector2(0, -200f), false); 这一行中,您将重力设置为极高的值(大约是地球重力的20 倍),然后您说它在没有重力的情况下下落?如果不是重力,你为什么认为它会向下加速?
  • 我的意思是没有加速。等我发这个视频。
  • 这是此问题的视频:youtube.com/watch?v=NkbcVMsB2S0<br> 在此视频中,您可以看到圆在加速度=0 的情况下下降。我试图改变一些参数,但看起来加速度总是为零..

标签: libgdx box2d gravity


【解决方案1】:

我认为这是因为身体立即处于最大速度(因为重力非常高)。 Box2D 有一个最大速度,我认为它是每步 2m。似乎您在通常限制为 60FPS 的移动设备上运行它。这意味着您每秒最多有 60 个更新步骤,因此最大速度/速度为 120m/s。顺便说一句,您的更新速率取决于帧速率。

我看到您已经定义了米到像素和像素到米的常量,但是您没有在代码中的任何地方使用它们。这意味着您使用的是 1:1 的米像素比,因此任何物体可以拥有的最大速度是 120px/s。这不是很多,从那个视频来看,它可能是正确的。

一个常见的技巧是缩小相机的视口,而不是放大所有与 box2d 相关的东西。像这样:

camera.viewportHeight = Gdx.graphics.getHeight() * WORLD_TO_BOX;
camera.viewportWidth = Gdx.graphics.getWidth() * WORLD_TO_BOX;

【讨论】:

    【解决方案2】:

    我有类似的问题。在我的情况下,解决方案是将 BOX_STEP 参数的值更改为 1/240(它曾经是 1/60,然后最大线速度为 120)

    static final float BOX_STEP=1/240f;
    static final int BOX_VELOCITY_ITERATIONS=20;
    static final int BOX_POSITION_ITERATIONS=3;
    

    所以在 renderer() 步骤中现在采用上述方法

    world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);

    我还介绍了 noone answear,但没有更改 step 方法,它不起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2013-07-07
      相关资源
      最近更新 更多