关于使用Perlin Noise生成平铺图的基本问题

时间:2012-08-24 20:04:20

标签: algorithm perlin-noise

我正在尝试为2d瓷砖地图游戏制作地图生成器(类似于像文明这样的游戏 - 我喜欢创建小岛屿或大洲等的能力)。我发现了一篇文章,它几乎完全符合我的要求,但它是用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实现并复制/粘贴它)。

我只是想了解使用perlin噪音背后的基本原理 - 我的基本理解:

  1. 定义所需地图的大小(在我的情况下约为100 x 50个图块)。
  2. 初始化一个perlin噪声对象(设置诸如频率等的参数 - 不太确定这些参数如何影响岛屿大小等事情,但暂时放在一边)。
  3. 迭代我的地图中的每个图块,并询问perlin噪声对象的值。返回的值可以解释为我猜的高度值。
  4. 现在根据高度值指定一个图块类型。
  5. 迭代代码可能类似于:

    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()

    由于

1 个答案:

答案 0 :(得分:1)

给定适当的初始化,你的迭代代码应该尽我所能。那就是:如果你想要将2D Perlin噪音限制在水,岸,山和山上。

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