斜拼地格(Herringbone Tiles)

斜拼地格(Herringbone Tiles)

作者 Sean Barrett
来自 Silver Spaceship Software
原文

在这篇文章中我将阐述一种对于王氏网格(Wang Tile)技术的扩展,它使用许多小2D区域生成大的2D区域。我将其命名为斜拼王氏网格(Herringbone Wang Tiles)。它也特指由Sucker Punch制作的《Infamous》的地图生成系统。

在我2010做的一个没发布的CRPG游戏里,我用了一种特别简单的地牢地图生成方式。它用小方块地格去拼成大的地图,这些小的方块从预制的128种中选出(这128个地格由传统意义上的tile拼出来,为了避免歧义这里叫他们精灵(sprites))。这个地图生成算法特别简陋:每个地格都是随机生成的,即没有关于相邻地格的约束,也没有关于连通性的约束。

让它变得可用的主要技术是一个与众不同的斜拼方法,在把小2D方格拼成大块时,这个技术能够降低规则方格的可见程度,并且带来比啥都不做好一些的连通性。

另一种我没用的技术是拼图颜色(jigsaw colors)。它可以是的地格边缘的形状改变,以此来打破常规拼贴方式带来的长直边。因为我没有用它所有也就不再谈论了。

王氏网格(Wang Tile)

这个技术的核心思想是基于王氏网格的。它直接生成有许多边界约束的小地格,把地格放在适合他们现有边界约束的地方,然后生成一张地图。边界约束是最主要的特征;比方说去生成一张有联通性约束的mostly-solid(译者:大部分是固体/固定?)的地图,比如说地牢,你也许会想:“规则1,每个边界的中间都有一个1米宽的门”。你也许也会有对于其它属性的约束,比方说渲染属性,高度属性之类的。

在王氏网格(Wang Tile)中,你可以使用一个简单的从左往右,从上到下的生成器。在生成的每一步中,你需要挑选一个地格,它要满足至多两条边界的限制(也就是说,它需要需要满足毗邻的已生成的地格的约束),这时你需要满足四种约束情况。只要你对于每种情况都有至少一个地格以供选择,就能生成一张大地图了。

当然,你也需要更多的备选项来防止重复。

一条得到“最佳”结果的原则是,你必应该对每种情况都有足够的地格,以便可以拥有“输出”边的所有可能组合;这使得给出位置的地格的选择被限制在了仅影响了它当前的邻居;这对更远的地格的选择没有影响。对于两种边界变化来说,这意味着最少有16个预制地格。对于三种变化来说,这意味着最少81种地格,这似乎太过了。我会称呼这种地格的组合为“完全随机组合”。

这是一篇使用王氏网格的经典文章,Wang Tiles for Image and Texture Generation (作者:Cohen et al),每种规则仅仅使用了2个图块;例如,有3种边界变化的话,就总有9种情况,那他们就只用了18种图块。它对为什么这样就能有足够好的结果做出解释,也没有给出如何通过特定数目的的约束来构造一个好的图块集合的机制。很明显,每一步有两种图块选择给予了我们一些随机选择的空间,也让生成结果不会有周期性;但它不是一定要最小化的,也不是很明显如何选择一组好的“输出”边缘给每个情况,来保证生成的内容分布良好。

作为对比,完全随机的组合虽然需要更多的内容,但它不需要对生成过程进行干预。

大的网格

有时候放入一些“特别内容”是很有用的,这些内容会比一般的单个网格大不少。对于纹理生成来说,这可能是一些特别出现的组合;对城市生成来说,可能是一个会覆盖不止一个寻常地格的巨大会议中心;对地牢来说,它可能是一个巨大的洞穴。这种特殊的区域会覆盖等同于多个一般地格所占据的区域;也许是2x1大小,1x2大小,3x4大小,乃至于不规则大小的格子。对于王氏网格来说,这处理起来很简单;比如处理一个2x1大小的格子时,将它分成两个1x1的格子并在他们彼此边界中间引入一种全新的规则(颜色)。这样当你放置了其中一个格子之后就只能拜访剩下的那一个来完成生成。

但是,它在上述的完全随机生成

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值