首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能创造一个“无限”的世界?

我怎样才能创造一个“无限”的世界?
EN

Stack Overflow用户
提问于 2010-06-16 08:54:09
回答 5查看 6.6K关注 0票数 29

我想创造一个无休止的(实际上是一个非常大的)世界的游戏,玩家可以在其中移动。我是否会有时间来实现这个游戏是一回事,但我觉得这个想法很有趣,并希望在如何做它的一些投入。

关键是要有一个世界,在这个世界里,所有的数据都是按需随机生成的,但要以确定性的方式生成。

目前,我的重点是一个大的2D地图,它应该可以显示任何部分,而不了解周围的部分。

我通过编写一个函数实现了一个原型,该函数给出了一个随机但却是确定性的整数,给定地图上像素的x和y(参见我最近关于这个函数的问题)。使用此函数,我使用“随机”值填充映射,然后使用基于周围像素的简单过滤器平滑映射。这使得地图依赖于边缘外的几个像素,但这不是什么大问题。最后的结果是一些至少看起来像地图(特别是一个良好的高度彩色地图)。考虑到这一点,人们可能会首先生成一张更粗的地图,用来产生更大的海拔差异,从而形成山脉和海洋。

不管怎么说,这是我的想法,但我相信已经有办法做到这一点,而且我也相信,考虑到规范,你们中的许多人可以想出更好的想法。

编辑:忘了我问题的链接。

编辑2:我想我需要澄清的是,地图的两个相邻部分(分别生成)需要顺利地连接到彼此,这一点很重要。

编辑3:在评论中询问了更多信息。

下面是一张拍摄的从一页关于分形和Perlin噪声的文章中图片,它看起来很像我以前制作的图像(因为我最好的尝试可能使用了Perlin噪声):

把黑色像素想象成深海,白色像素像山顶。这就是我需要的,一张简单的二维高程图。

我想要做的是从非常大的世界(在MAXINT * MAXINT像素范围内)选择任何矩形并生成它。如果我要生成上面图像的任何部分,它应该得到完全相同的像素,就像我生成了包含较小部分的更大的部分一样。

现在谈谈“无故”的问题:

所需的性能:我的主要目标是基于转弯的RPG,所以性能可能很低,但是我想看看是否有可能创建一个快速的算法是非常有趣的。

内存要求:最好不要预先生成任何内容,但除此之外,内存使用应该与任何普通游戏或应用程序相匹配。

需要的细节:好吧,如果你看一下图像,你就知道了。这将是非常好的,不过,如果它是可以放大和平移,而不必计算地图在最缩放的水平第一。

所需的对象类型和对象属性的生成:没有什么花哨,我很高兴根据上面的图像地形。但我承认,我一直在考虑类似的设置,那里的一切都是非常大的城市。不过,这将是另一个问题。

编辑4:希望是最后一个。

好吧,看了一会儿之后,看来佩林的噪音是最好的选择。不过,我还有一个问题(如果有人愿意回答,因为我已经接受了一个(实际上是两个)答案:)。

perlin噪声函数采用双倍。双打的距离是多少?[0-1]?或者我能高兴地把我的大整数发送进来吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-16 09:38:34

通常情况下,所有地形/世界发电机都以你描述的方式工作--它们能够从非常有限的输入数据(一组参数)中产生巨大的(随机的)世界。

因此,您可能需要进一步限制您的问题。

如果有什么对你有用,或者如果你只是乞求研究--看看不同的焦点和方法,这里

至于随机性/确定性,我不确定你是否真的在这里谈论随机性,这可能有点令人困惑,我想你只想创造出很多变化。所以你可能想把它从你的搜索词中删除。

还可以看看过程生成 (特别是“请参阅”和“外部链接”)。

就我个人而言,我认为在地形综合的概念中有很多希望,在这个概念中,您基本上将真实的地形样本与某种转换操作混合和匹配--这提供了具有所需属性的逼真的地形。

编辑:这是正在处理中中“等离子体分形”(中间点位移)的实现

如果这对您来说足够好的话,那么您可以重新设计算法,允许它生成网格的任何部分(我感觉它会归结为哈希坐标,在连接线周围或任何地方获得随机数种子)。

此外,您可以使用此方法处理不同级别的详细信息,以便生成更多更接近视图的详细信息。

票数 5
EN

Stack Overflow用户

发布于 2010-06-16 09:04:15

看看Perlin噪声,它是一种确定性随机数据,以它的发明者Ken命名。如果您搜索"Perlin噪声“或”generation“,您将发现大量关于过程纹理和景观生成的文章。

票数 2
EN

Stack Overflow用户

发布于 2010-06-16 10:26:07

地形通常是由分形生成的。

一个简单的方法是等离子体云算法,也称为中点位移算法。总的想法是:

  1. 为该地区的拐角设置一些高度值。
  2. 将矩形分成4个较小的矩形。
  3. 计算新点的高度作为周围点的平均值,并在此基础上增加一些随机位移值。
  4. 递归地将每个矩形分割成较小的矩形,并相应地减少位移量。

用伪随机数发生器产生随机值。如果在开始时给出特定的种子,则总是生成相同的数字序列。

等离子体云自动产生平滑过渡,因此不需要额外的平滑滤波器。

等离子云提供了相当现实的景观,但从长远来看,它们会变得枯燥乏味。因此,更复杂的算法(Perlin噪声,脊Perlin等)可另外使用。为了得到更多的变化,您可以使用一个分形(低分辨率)添加另一个分形的参数来计算实际值。

分形也可以用来创建纹理和凹凸图。

使用分形和其他过程方法生成景观的程序的一个很好的例子是Terragen。Terragen生成照片真实感的图像,所以它是缓慢的,但它有OpenGL预览,创造了飞行的景观。

编辑:等离子体云的问题是,如果不生成整个区域,就不能生成一个点(或一个小区域)。这是因为它通常使用随机数生成器,它依赖于先前的随机数值。

但是,您实际上并不需要统计上好的随机数生成器来生成地形。因此,您可以将rand函数替换为从X和Y坐标计算随机数的函数,而不是以前的值。像这样的东西(未经测试):

代码语言:javascript
复制
const int a = 0x7fffffff / 48271;
const int b = 0x7fffffff % 48271;

int displacement(int x, int y)
{
    int     seed, result;

    seed = x ^ ((y << 1) & 0x2AAAAAAA) ^ ((y >> 1) & 0x33333333);
    result = 48271 * (seed % a) - b * (seed / a);

    Return (result & 0xffff);
}

根据实际随机数产生器对上述结果进行修正,使种子由x和y计算,但可能更简单的函数就足够了。

Edit2:要创建无限世界,可以从10公里x10公里的矩形开始。使用上面的位移函数为您的目标位置所在的矩形角设置初始高度。然后开始用等离子云算法分割正方形。您只需拆分和计算您感兴趣的那些方块,那么您将很快到达目标区域(这很像二进制搜索)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3051864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档