Matrix 使用视口时的LibGDX-Box2D矩阵渲染问题

Matrix 使用视口时的LibGDX-Box2D矩阵渲染问题,matrix,libgdx,rendering,box2d,offset,Matrix,Libgdx,Rendering,Box2d,Offset,关于使用box2d和libgdx进行渲染,我有一个问题。 正如您在下面的屏幕截图中看到的,我在更改窗口分辨率时遇到问题 Box2d在整个屏幕上缩放,尽管视口仅使用其中的一小部分。此外,灯光被缩放,不再与实际位置匹配(但我认为这与同一问题有关) 我的想法是,在渲染之前,我需要调整box2d的矩阵(b2dCombinedMatrix),但我不知道如何调整 我个人认为我需要告诉它应该使用与视口相同的“渲染边界”,但我不知道如何做到这一点 以下是渲染方法(问题在“绘制灯光注释”部分之后): 这是一种调整

关于使用box2d和libgdx进行渲染,我有一个问题。 正如您在下面的屏幕截图中看到的,我在更改窗口分辨率时遇到问题

Box2d在整个屏幕上缩放,尽管视口仅使用其中的一小部分。此外,灯光被缩放,不再与实际位置匹配(但我认为这与同一问题有关)

我的想法是,在渲染之前,我需要调整box2d的矩阵(b2dCombinedMatrix),但我不知道如何调整

我个人认为我需要告诉它应该使用与视口相同的“渲染边界”,但我不知道如何做到这一点

以下是渲染方法(问题在“绘制灯光注释”部分之后):

这是一种调整大小的方法,它将视口向上移动4个世界单位:

public void resize(final int width, final int height) {
    viewport.update(width, height, false);
    // offset viewport by y-axis (get distance from viewport to viewport with offset)
    renderOffsetVector.set(gameCamera.position.x - gameCamera.viewportWidth * 0.5f, RENDER_OFFSET_Y + gameCamera.position.y - gameCamera.viewportHeight * 0.5f, 0);
    gameCamera.project(renderOffsetVector, viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(), viewport.getScreenHeight());
    viewport.setScreenY((int) renderOffsetVector.y);
}


经过几个小时的摆弄矩阵,我终于让它工作了,但实际上我的问题有一个非常简单的解决方案:D

基本上,rayhandler的渲染方法一直在扰乱我的矩阵计算,原因是我没有告诉它使用自定义视口

因此,将resize方法调整为

public void resize(final int width, final int height) {
    viewport.update(width, height, false);
    // offset viewport by y-axis (get distance from viewport to viewport with offset)
    renderOffsetVector.set(gameCamera.position.x - gameCamera.viewportWidth * 0.5f, RENDER_OFFSET_Y + gameCamera.position.y - gameCamera.viewportHeight * 0.5f, 0);
    gameCamera.project(renderOffsetVector, viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(), viewport.getScreenHeight());
    viewport.setScreenY((int) renderOffsetVector.y);

    rayHandler.useCustomViewport(viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(), viewport.getScreenHeight());
}
并将渲染方法简化为

 // draw lights
    rayHandler.setCombinedMatrix(gameCamera);
    rayHandler.updateAndRender();
    if (DEBUG) {
        b2dRenderer.render(world, b2dCombinedMatrix);
        Gdx.app.debug(TAG, "Last number of render calls: " + spriteBatch.renderCalls);
    }
解决了我的问题

也许我很愚蠢,但我在任何文档中都没有找到useCustomViewport方法。 不管怎样,解决了

 // draw lights
    rayHandler.setCombinedMatrix(gameCamera);
    rayHandler.updateAndRender();
    if (DEBUG) {
        b2dRenderer.render(world, b2dCombinedMatrix);
        Gdx.app.debug(TAG, "Last number of render calls: " + spriteBatch.renderCalls);
    }