我有一些金属经验和相当多的团结,并熟悉设置网格,缓冲区,和支持数据绘制;但没有那么多的数学/阴影方面。我在挣扎的是如何建立一个无穷无尽的滚动世界。所以,如果我向右偏远,我可以看到左边,然后继续前进。
这一应用将是一个无缝的地形,玩家可以永远滚动任何方向,并让它只是包装。
我不想重复所有的抽签和抵消,这似乎是可怕的低效。我希望有一种方法,要么使用一些神奇的矩阵数学,或某种着色器,以获得东西包装/绘图,他们应该在哪里,当平移地图。我到处找一些关于如何让这件事奏效的指南或解释,但没有想出任何办法。
我知道很多古老的(dos)游戏都是这么做的,它还可能吗?为什么这个行业似乎已经从这种类型的滚动(边界到边缘和包装)转移了呢?
发布于 2016-10-12 09:36:14
我已经创建了一个简单例子来演示您正在寻找的内容(我认为)。
它的基本思想是在重复网格中使用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)
}这就是它的样子:
发布于 2017-01-29 02:39:08
只是跟进一下我实际执行的内容。首先,我基本上有一个x,y点阵列的高度,地形类型和所有的爵士乐。使用一些简单的%和加法/减法,就很容易得到点周围的节点来生成三角形。
在抽签时,我计算第一个显示点和最后一个显示点,并计算在这些点之间显示的三角形组。第一点/最后一点考虑到包装,然后有一个无穷无尽的包装世界是非常琐碎的。对于每个组,一个平移偏移将通过该组的统一矩阵传递,该矩阵将将该区段定位到它应该属于的位置。
我通过renderEncoder.setVertexBytes(&uniform, length:..., offset:...)设置它
https://stackoverflow.com/questions/39979352
复制相似问题