【问题标题】:Imprecise Box2d coordinates using LibGDX使用 LibGDX 的不精确 Box2d 坐标
【发布时间】:2014-03-06 00:25:14
【问题描述】:

我正在使用 LibGDX 和 Box2d 构建我的第一个 Android 游戏。耶!

但我在使用 Box2d 时遇到了一些严重问题。

我有一个简单的舞台,底部的矩形 Box2d 主体代表地面,左右两侧的另外两个矩形 Box2d 主体代表墙壁。

A Screenshot

Another Screenshot

我也有一个盒子。可以触摸此框并使用 applyLinearImpulse 移动它,就像它被踢一样。它是一个 DynamicBody。

发生的情况是,在我的 Box 对象的 draw() 代码中,Box 对象的 Box2d 主体给了我一个错误的 X 轴值。 Y 轴的值很好。

屏幕截图上的那些蓝色“点”是我打印在 body.getPosition() 给我的盒子边缘上的小纹理。请注意,在一个屏幕截图中,这些点是如何与实际的 DebugRenderer 矩形对齐的,而在另一个屏幕截图中却不是。

这是正在发生的事情:当盒子移动时,对齐会在移动中丢失。

考虑到 DebugRenderer 渲染的区域,盒子、地面和墙壁之间的碰撞恰好发生。但是 body.getPosition() 和 fixture.testPoint() 会考虑那些蓝点内的区域。

因此,不知何故,Box2d 为同一个主体“维护”了这两个区域。

我认为这可能是我的像素和米转换之间的某种“精度损失”(我将缩放 100 倍),但 Y 轴使用相同的技术,这很好。

所以,我想我可能会遗漏一些东西。

编辑 1

我正在从 Box 坐标转换为 World 坐标。如果您在屏幕截图中看到蓝色的调试精灵,它们几乎完美地形成了盒子。

public static final float WORLD_TO_BOX = 0.01f;
public static final float BOX_TO_WORLD = 100f;

盒子渲染代码:

public void draw(Batch batch, float alpha) {
    x = (body.getPosition().x - width/2) * TheBox.BOX_TO_WORLD;
    y = (body.getPosition().y - height/2) * TheBox.BOX_TO_WORLD;

    float xend = (body.getPosition().x + width/2) * TheBox.BOX_TO_WORLD;
    float yend = (body.getPosition().y + height/2) * TheBox.BOX_TO_WORLD;

    batch.draw(texture, x, y);
    batch.draw(texture, x, yend);
    batch.draw(texture, xend, yend);
    batch.draw(texture, xend, y);
}

编辑 2

我开始怀疑相机了。我得到了 DebugRenderer 和一个 scene2d 舞台。代码如下:

我的屏幕分辨率(Nexus 5,它是纵向的):

public static final int SCREEN_WIDTH = 1080;
public static final int SCREEN_HEIGHT = 1920;

在启动时:

// ...
    stage = new Stage(SCREEN_WIDTH, SCREEN_HEIGHT, true);

    camera = new OrthographicCamera();
    camera.setToOrtho(false, SCREEN_WIDTH, SCREEN_HEIGHT);

    debugMatrix = camera.combined.cpy();
    debugMatrix.scale(BOX_TO_WORLD, BOX_TO_WORLD, 1.0f);
    debugRenderer = new Box2DDebugRenderer();
// ...

现在,render() 代码:

public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    camera.update();

    world.step(1/45f, 6, 6);
    world.clearForces();

    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();

    debugRenderer.render(world, debugMatrix);
}

【问题讨论】:

  • Box2D 使用它自己的坐标系。你是在绘制之前从Box2D的坐标系转换为libGDX的坐标系吗?
  • 是的,我编辑了问题。
  • 我认为精度损失不是问题,因为类似的转换比例对我来说效果很好。你在用OrthographicCamera吗?
  • 是的,我有一个 OrtographicCamera 设置。
  • 请使用 Box2dDebugRenderer 绘制您的 box2d 主体等,不要自己动手。看看这个渲染器是否产生相同的偏移量。

标签: android libgdx box2d


【解决方案1】:

看起来这个问题的答案相当简单:

    stage.setCamera(camera);

我没有将 OrthographicCamera 设置到舞台,所以舞台使用了某种与我的东西不相符的默认相机。

它最终与 Box2d 无关。 Box2d 正在返回健康值,但由于舞台分辨率错误,这些值对应于我屏幕中的错误位置。

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多