我正在使用LibGDX和Box2d來構建我的第一個Android遊戲。好極了!使用LibGDX不精確的Box2d座標
但是我遇到了Box2d的一些嚴重問題。
我有一個簡單的舞臺,底部有一個矩形的Box2d物體代表地面,另外兩個矩形的Box2d物體都在左邊和右邊,代表着牆壁。
我也有一個盒子。這個盒子可以被觸摸,並使用applyLinearImpulse移動,就像被踢了一樣。它是一個DynamicBody。
會發生什麼情況是,在Box對象的draw()代碼中,Box對象的Box2d正文給我一個X軸的錯誤值。 Y軸的值很好。
截圖上的那些藍色「點」是我在body.getPosition()給出的框邊上打印的小紋理。請注意,在一個屏幕截圖中,點與實際的DebugRenderer矩形是如何對齊的,而其他的則不是。
這就是發生了什麼:當盒子移動時,對齊在運動中丟失。
盒子,地面和牆壁之間的碰撞恰好考慮到DebugRenderer呈現的區域。但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);
}
編輯2
我開始懷疑相機。我得到了DebugRenderer和一個scene2d Stage。下面是代碼:
我的屏幕分辨率(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();
// ...
現在,渲染()代碼:
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的座標系? – kabb
是的,我編輯了這個問題。 – xrash
我不認爲精度損失是問題,因爲類似的轉換比例對我來說工作正常。你正在使用'OrthographicCamera'嗎? – user3312130