algorithm - 使用 Perlin Noise 生成瓦片 map 的基本问题

标签 algorithm perlin-noise

我正在尝试为 2d tilemap 游戏制作 map 生成器(类似于 Civilization 之类的游戏 - 我希望能够创建小岛或大洲等)。我发现一篇文章几乎可以满足我的需求,但它是用 flash 编写的。看起来有一个方便的函数可以从 perlin 噪声生成位图:

class BitmapData
function perlinNoise(
    baseX:Number, 
    baseY:Number, 
    numOctaves:uint, 
    randomSeed:int, 
    stitch:Boolean, 
    fractalNoise:Boolean, 
    channelOptions:uint = 7, 
    grayScale:Boolean = false, 
    offsets:Array = null):

这是文章中使用的(但我使用的是 java)。所以现在我坚持尝试自己实现 perlin 噪声(基本上找到一个纯 java 实现并复制/粘贴它)。

我只是想了解使用柏林噪声背后的基本原理 - 我的基本理解:

  1. 定义您想要的 map 大小(在我的例子中大约是 100 x 50 个图 block )。
  2. 初始化 perlin 噪声对象(设置频率等参数 - 不太确定这些参数如何影响岛屿大小等,但暂时搁置)。
  3. 遍历 map 中的每个图 block ,并向 perlin 噪声对象询问一个值。返回值可以解释为我猜测的高度值。
  4. 现在根据高度值分配瓷砖类型。

迭代代码可能类似于:

for (int x = 0; x < 100; x++) {
    for (int y = 0; y < 50; y++) {
        int height = perlin.getValue(x, y);
        if (height < 5); // this tile is water
        else if (height < 20); // this tile is shore
        else if (height < 40); // this tile is hill
        else // this tile is mountain
    }
}

这通常是正确的吗?这至少是一个起点。

这篇文章(用 flash 写的)符合我的要求: http://www.nolithius.com/game-development/world-generation-breakdown

Flash BitmapData 类,它方便地内置了一个 perlin 噪声函数: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#perlinNoise ()

谢谢

最佳答案

只要进行适当的初始化,就我所见,您的迭代代码应该可以正常工作。也就是说:如果您想将 2D Perlin 噪声阈值设置为水、海岸、山丘和山脉。

This page对 Perlin 噪声和伪代码示例有一些有用的解释。本质上,该算法将噪声函数与频率增加和幅度减小相加。

关于algorithm - 使用 Perlin Noise 生成瓦片 map 的基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12115913/

相关文章:

opengl - 如何创建分形立方体?

java - Perlin 噪声生成无法正常工作

algorithm - 化简 log n/3i 的总和

java - 将命令式代码转换为非连续一个实现的声明式代码

c# - 二维柏林噪声。为什么我必须采用位移和梯度向量的点积?

c++ - 如何创建用于噪声生成的哈希函数

java - 部分有序比较器到全序比较器

algorithm - 进行眼睛跟踪的通用算法

arrays - 嵌套循环的复杂性

python - 如何从 perlin-noise 获得 2D 图 block 输出?