在3D地图上无休止地滚动

时间:2016-10-11 14:16:48

标签: ios swift metal

我对Metal有一些经验,对Unity很有兴趣,熟悉设置网格,缓冲区和绘图的支持数据;但不是数学/着色器方面。我所挣扎的是如何获得无尽的滚动世界。因此,如果我向右侧移动,我可以看到左侧并继续前进。

这个应用将是一个无缝的地形,玩家可以永远向任何方向滚动,让它只是包裹。

我不想在绘制时复制一切并抵消它,这看起来非常低效。我希望有一种方法可以使用一些魔术矩阵数学或某种着色器来包装/绘制在平移地图时应该放置的东西。我已经搜遍了各种各样的指南或解释如何使这个工作,但没有想出任何东西。

我知道很多旧的(dos)游戏以某种方式做到了这一点,还有可能吗?有没有理由说这个行业似乎已经从这种类型的滚动中迁移出来(边缘与包裹相对)?

2 个答案:

答案 0 :(得分:3)

我创建了一个simple example来展示你正在寻找的东西(我想)。

它的基本思想是使用drawPrimitives(type:vertexStart:vertexCount:instanceCount:)上的MTLRenderCommandEncoder方法在重复网格中绘制地图。作为实例计数,您希望传递要绘制的相同地图的数量,将其扩展到需要的位置,以便看不到它的结束位置。在我的例子中,我使用了一个简单的5x5网格。

为了让用户看不到地图的边缘,我们将计算他们的位置模1(或地图的大小):

func didDrag(dx: CGFloat, dy: CGFloat) {
    // Move user position on drag, adding 1 to not get below 0
    x += Float(dx) * draggingSpeed + 1
    z += Float(dy) * draggingSpeed + 1

    x.formTruncatingRemainder(dividingBy: 1)
    z.formTruncatingRemainder(dividingBy: 1)
}

它的外观如下:

答案 1 :(得分:0)

只是跟进我实际实施的内容。首先,我基本上有一个x,y点阵列,包括高度,地形类型和所有爵士乐。使用一些简单的%和加法/减法,让点周围的节点生成三角形是微不足道的

在平局上,我计算第一个显示点和最后一个显示点,并计算这些点之间显示的三角形组。第一点/最后一点考虑到包装,然后有一个无尽的包装世界是非常微不足道的。对于每个组,翻译偏移量通过该组的统一矩阵传递,该矩阵将该区域定位在它应该属于的位置。

我是通过renderEncoder.setVertexBytes(&uniform, length:..., offset:...)

设置的