使用perlin噪声在C#中生成地形

时间:2012-03-14 06:41:28

标签: c# xna perlin-noise

我正在使用C#和XNA开展文明游戏。我使用一个二维整数数组,填充一个循环,生成瓷砖,我做了很多研究,并一直无法找到一种方法来生成类似地形的地球。任何人都可以解释如何做到这一点或至少给我代码可以做到这一点,虽然我更喜欢和解释?谢谢。

1 个答案:

答案 0 :(得分:8)

我使用类似于此的算法来制作我的地形。基本上它会产生一些随机数并使用正弦波来产生山丘,当它们结合起来时,它们会产生一个很好的丘陵景观。请注意,如果您想要超过3次传递,则可以添加循环和值数组。

private void GenerateTerrain()
    {
        terrainContour = new int[Width*Height];

        //Make Random Numbers
        double rand1 = randomizer.NextDouble() + 1;
        double rand2 = randomizer.NextDouble() + 2;
        double rand3 = randomizer.NextDouble() + 3;

        //Variables, Play with these for unique results!
        float peakheight = 20
        float flatness = 50 
        int offset = 30;


        //Generate basic terrain sine
        for (int x = 0; x < Width; x++)
        {

            double height = peakheight / rand1 * Math.Sin((float)x / flatness * rand1 + rand1);
            height += peakheight / rand2 * Math.Sin((float)x / flatness * rand2 + rand2);
            height += peakheight / rand3 * Math.Sin((float)x / flatness * rand3 + rand3);

            height += offset;

            terrainContour[x] = (int)height;
        }
    }

然后填充高度图只需遍历值并检查它是否高于阈值。

for (int x = 0; x < Width; x++)
{
   for (int y = 0; y < Height; y++)
   {

       if (y > terrainContour[x])
           tiles[x, y] = Solid Tile
       else
           tiles[x, y] = Blank Tile
   }
}

你可以添加更多的东西,我添加了更多的随机性并将一些瓷砖向上或向下缩进1以获得更好的地形。并且添加更多正弦波将使其更加真实。

尝试使用2D Perlin Noise算法,并选择某些高度来制作洞穴和更高级的地形,因为这就是我现在所做的,但这里的代码是一个良好的开端。