如何正确组合两个摄像机视图矩阵?

时间:2017-10-25 12:27:05

标签: java matrix libgdx

基本上,我有一个3D六边形瓷砖地图(想想像简化的文明5地图)。它经过优化,可以使用单个大型网格来减少绘制调用,并轻松实现一些很酷的文明5特征(地形连续性和紫外纹理渗透)。

我想在我的游戏中支持环绕地图,因此集思广益,如何最好地做到这一点。

例如,如果主摄像头正在接近地图的远东,那么我可以通过以下方式简单地执行到远西的翻译:

if(camera.x >= MAP_WIDTH)
    camera.translate(0, 0, y);

然而,通过这样做,将有一个短暂的时间跨度,玩家将在翻译之前看到董事会的“结束”。我想消除这个。

我必须解决这个问题的第一个想法是基本上只修改上面的代码如下:

if((camera.x + camera.viewportWidth >= MAP_WIDTH)
    camera.translate(0, 0, y);

然而,这在翻译过程中会产生“跳跃”的副作用,感觉不自然。

我的最终解决方案,以及问题的主题:

我有三台摄像机,我的主摄像头,一台远东,一台远西。我基本上想要“组合”这些相机的矩阵,以使地图在其实际范围之外呈现。

基本上,如果相机距离世界边界有一定距离,我想在以下位置从世界的另一边画出场景。所以,例如,这是我想要做的伪代码:

int MAP_WIDTH = 25;
float viewportSize = 10f;
float mainCamX = 24f;
float mainCamY = 15f;
Matrix4 cbnd = camera.combined;
if(camX >= MAP_WIDTH)
    camX = 0;
else if(camX < 0)
    camX = MAP_WIDTH - camX;
if(camX + viewportSize >= MAP_WIDTH)
    cbnd = combineMatrices(mainCam.combined, westCam.combined);
modelBatch.setProjectionMatrix(cbnd);
modelBatch.begin();
//Draw map model
//Draw unit models.
modelBatch.end();
modelBatch.setProjectionMatrix(mainCam.combined);

但我不确定如何恰当地组合矩阵,并且对于矩阵的概念一般都不熟悉。

有人能帮我把这些矩阵结合起来吗?

1 个答案:

答案 0 :(得分:0)

听起来太复杂了。这是我的想法:

  • 即。您可以在屏幕上显示10x10字段
  • 您有地图100x100字段
  • 只需将您的地图增加到110x110,并在该额外空间重复您的第一个(最零行和列)

通过这种方式,您可以平滑地滚动,当相机到达时,即您在地图上的最右侧位置,只需将其返回到0 X位置。垂直运动也是如此。

因此,想法是分别在地图的高度/底部的屏幕高度的大小和屏幕高度大小的地图的宽度和地图的最顶部分别具有最大的左侧部分。