Android 使用LibGDX的不精确Box2d坐标

Android 使用LibGDX的不精确Box2d坐标,android,libgdx,box2d,Android,Libgdx,Box2d,我正在使用LibGDX和Box2d构建我的第一个Android游戏。耶 但是我在Box2d上遇到了一些严重的问题 我有一个简单的舞台,底部有一个长方形的Box2d实体代表地面,左侧和右侧有两个长方形的Box2d实体代表墙壁 我还有一个盒子。这个盒子可以用ApplyLinearPulse触摸和移动,就像被踢一样。这是一个充满活力的身体 发生的情况是,在Box对象的my draw()代码中,Box对象的Box2d主体为X轴提供了错误的值。Y轴的值很好 屏幕截图上的蓝色“点”是我打印在主体框边上的

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

但是我在Box2d上遇到了一些严重的问题

我有一个简单的舞台,底部有一个长方形的Box2d实体代表地面,左侧和右侧有两个长方形的Box2d实体代表墙壁

我还有一个盒子。这个盒子可以用ApplyLinearPulse触摸和移动,就像被踢一样。这是一个充满活力的身体

发生的情况是,在Box对象的my draw()代码中,Box对象的Box2d主体为X轴提供了错误的值。Y轴的值很好

屏幕截图上的蓝色“点”是我打印在主体框边上的小纹理。getPosition()给我。请注意,在一个屏幕截图中,点与实际矩形对齐,而在另一个屏幕截图中,点与实际矩形不对齐

这就是发生的情况:当长方体移动时,对齐在移动中丢失

考虑到渲染器渲染的区域,长方体、地面和墙之间的碰撞会精确发生。但是body.getPosition()和fixture.testPoint()会考虑这些蓝色圆点内的区域

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

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

所以,我想我可能错过了什么

编辑1

我正在从框坐标转换为世界坐标。如果在屏幕截图中看到蓝色的调试精灵,它们几乎完美地构成了框

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);
}
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);
}
编辑2

我开始怀疑摄像机。我得到了调试渲染器和场景2D舞台。代码如下:

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

启动时:

// ...
    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();
// ...
现在,呈现()代码:


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

    stage.setCamera(camera);
我没有将正交摄影机设置到舞台,因此舞台使用的是某种默认摄影机,与我的作品不对齐


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

Box2d使用自己的坐标系。你在绘图之前是否将Box2D的坐标系转换为libGDX的坐标系?是的,我编辑了这个问题。我不认为精度损失是个问题,因为类似的转换比例对我来说很好。您使用的是
正交摄影机吗?
?是的,我有一个Ortographic摄影机设置。请使用Box2Debugger渲染器绘制您的box2d实体等等,不要自己绘制。查看此渲染器是否产生相同的偏移。
    stage.setCamera(camera);