📜  unity get perlin noise 3d - C# (1)

📅  最后修改于: 2023-12-03 15:20:51.938000             🧑  作者: Mango

Unity中使用Perlin Noise 3D

简介

在Unity中,Perlin Noise是一种常用的随机噪声算法,它可以用来生成各种自然景观,如山脉、云彩、树木等。Perlin Noise的优点是能够生成连续的噪声,并且结果看起来非常自然和逼真。

在本文中,我们将介绍如何使用Unity中的C#编写3D Perlin Noise生成算法,并将其应用于地形生成。

生成3D Perlin Noise

下面是一个简单的3D Perlin Noise生成器的代码片段:

public static float[,,] Generate3DNoise(int width, int height, int depth, float scale, float offsetX = 0f, float offsetY = 0f, float offsetZ = 0f)
{
    float[,,] noiseMap = new float[width, height, depth];

    if (scale <= 0)
    {
        scale = 0.0001f; // 避免出现除以零错误
    }

    float maxNoiseHeight = float.MinValue;
    float minNoiseHeight = float.MaxValue;

    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < height; y++)
        {
            for (int z = 0; z < depth; z++)
            {
                float sampleX = (x + offsetX) / scale;
                float sampleY = (y + offsetY) / scale;
                float sampleZ = (z + offsetZ) / scale;

                float noiseHeight = Mathf.PerlinNoise(sampleX, sampleY, sampleZ); // 生成噪声值

                if (noiseHeight > maxNoiseHeight)
                {
                    maxNoiseHeight = noiseHeight;
                }
                else if (noiseHeight < minNoiseHeight)
                {
                    minNoiseHeight = noiseHeight;
                }

                noiseMap[x, y, z] = noiseHeight;
            }
        }
    }

    // 将生成的噪声值归一化到[0, 1]范围内
    for (int x = 0; x < width; x++)
    {
        for (int y = 0; y < height; y++)
        {
            for (int z = 0; z < depth; z++)
            {
                noiseMap[x, y, z] = Mathf.InverseLerp(minNoiseHeight, maxNoiseHeight, noiseMap[x, y, z]);
            }
        }
    }

    return noiseMap;
}

该函数接收五个参数:宽度、高度、深度、尺度和偏移量。它使用三个嵌套循环来遍历生成的噪声地图的每一个位置,并在每个位置使用Perlin Noise函数生成一个值。

生成的噪声图使用最小值和最大值进行归一化,以确保其值在[0, 1]之间。

应用

使用生成的3D噪声地图,可以轻松创建各种自然景观,如山脉、丘陵、洞穴等等。以下代码片段展示了如何在Unity中生成一个大小为100x50x100的噪声地形:

public class TerrainGenerator : MonoBehaviour
{
    public int width = 100;
    public int height = 50;
    public int depth = 100;
    public float scale = 20f;
    public float offsetX = 100f;
    public float offsetY = 100f;
    public float offsetZ = 100f;

    private void Start()
    {
        float[,,] noiseMap = PerlinNoise.Generate3DNoise(width, height, depth, scale, offsetX, offsetY, offsetZ);

        // 创建地形
        Terrain terrain = GetComponent<Terrain>();
        terrain.terrainData = new TerrainData();

        // 设置地形大小
        terrain.terrainData.size = new Vector3(width, height, depth);

        // 设置每个节点高度
        float[,] heights = new float[width, depth];
        for (int x = 0; x < width; x++)
        {
            for (int z = 0; z < depth; z++)
            {
                float noiseHeight = noiseMap[x, 0, z];
                heights[x, z] = noiseHeight;
            }
        }

        // 应用高度值
        terrain.terrainData.SetHeights(0, 0, heights);
    }
}

该脚本通过将每个节点的高度设置为噪声地形图中的对应高度值来创建地形。

结论

使用Perlin Noise生成3D地形是一种简单而强大的方法,可以为游戏和应用程序创建美丽和逼真的环境。在Unity中,可以使用C#编写一个自定义的3D Perlin Noise生成器来创建各种自然场景。