【问题标题】:How to create a proper ortographic camera in libgdx如何在 libgdx 中创建合适的正交相机
【发布时间】:2015-12-02 10:06:44
【问题描述】:

所以我有点难以理解正交相机在 libgdx 中的工作原理。

我想要的是有一个相机,它只在一个正方形内渲染东西,而另一个相机为我的整个屏幕设置边界。

所以在这里,我可以在游戏手柄的整个屏幕上做我想做的事情。但是,你在右上角看到的是游戏的背景图,我想渲染的部分只落在你在这里看到的红色方块内。我该如何实现?

相机应该这样做还是我需要想办法手动做到这一点?我真的很困惑相机和投影矩阵是如何工作的。

在这个屏幕上,左边的红色方块和绿色垫是使用我的屏幕相机的投影矩阵绘制的。地图(右上角)是使用我的地图摄像头绘制的。

地图凸轮是 400x400 的视口,但正如您所见,图块是矩形的,这不是我想要的纵横比。如果有人能简要解释一下相机的工作原理,我将不胜感激。

我没有在这里发布我的代码的原因是因为我觉得我需要了解相机机制如何工作才能正确编码,所以我想先解决这个问题。

遵循@Tenfour04 的建议效果很好。万一有人想知道我想要实现什么。这是一张图片。

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    单靠摄像头无法裁剪掉部分屏幕。为此,您需要使用 glViewport。 Libgdx 中已经有一个 Viewport 类可以为您做到这一点。您将需要两个正交相机(一个用于地图,一个用于 GUI),但视口可以创建自己的。

    private Viewport viewport;
    
    //in create:
    viewport = new FitViewport(400, 400);
    
    //in resize:
    viewport.update(width, height);
    
    //in render:
    viewport.getCamera().position.set(/*...move your map camera as needed*/);
    viewport.apply(); //viewport cropped to your red square
    batch.setProjectionMatrix(viewport.getCamera().combined);
    batch.begin();
    //draw map
    batch.end();
    
    //return to full screen viewport
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    
    batch.setProjectionMatrix(yourGUICamera.combined);
    batch.begin();
    //draw gui
    batch.end();
    

    【讨论】:

    • 我已经使用过类似的模式。我会试试这个并报告回来。谢谢!
    • 嗨@Tenfour04,这非常有效。非常感谢!。我只是没有正确应用和更新视口!再次感谢!
    【解决方案2】:

    会发生什么,相机会自动适应屏幕的大小。为了改变这一点,您需要使用FrameBuffer。帧缓冲区会将相机限制为所需的大小,然后可以绘制为纹理。

    创建尺寸为像素的帧缓冲区。

    //Initialize the buffer
    FrameBuffer fbo = new FrameBuffer(Format.RGB565, width, helght, false);
    

    在缓冲区内渲染世界。

    fbo.begin();
    
    //Draw the world here
    
    fbo.end();
    

    使用批处理将缓冲区绘制到屏幕上。

    batch.begin();
    
    batch.draw(fbo.getColorBufferTexture(), x, y);
    
    batch.end();
    

    【讨论】:

    • 并非所有设备上的 FrameBuffers 都支持 RGB888,因此您需要 RGB565 作为备份,因此这些设备上的颜色会低保真。
    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多