# Perlin Noise 的特点

  • 平滑过渡:与纯随机噪声不同,Perlin Noise 的值在空间上是连续的,能够生成平滑的噪声效果。
  • 无方向性:生成的噪声看起来没有明显的方向感,适合用来模拟自然现象。
  • 多维支持:Perlin Noise 可以生成一维、二维甚至三维的噪声,可以适应不同应用需求。
  • 频率控制:通过调整输入值的步长或缩放因子,可以改变噪声的频率,得到粗糙或细腻的噪声效果。

# 在 Unity 中使用 Perlin Noise

在 Unity 中,Perlin Noise 可以通过 Mathf.PerlinNoise(x, y) 方法来实现。它接受两个浮点数作为参数(通常是 x 和 y 坐标),并返回一个 0 到 1 之间的浮点数。

# 示例代码

在你的代码中,Perlin Noise 用于生成一条具有波动性的线条:

row
1
2
3
4
5
float x = i * 0.1f;
// 在 Perlin Noise 计算中加入随机偏移,使每次生成的曲线不同
float y = Mathf.PerlinNoise(i * frequency + randomOffset, randomOffset) * amplitude;
positions[i] = new Vector3(x, y, 0);

  • Mathf.PerlinNoise(i * a, i * a) :生成一个平滑波动的 y 值,其中 i * a 控制输入的步长, a 是一个缩放因子,影响噪声的频率。
  • posArr[i] :用 Perlin Noise 生成的 y 值创建一个三维点位置数组,用于设置 LineRenderer 的路径。
  • randomOffset :通过添加随机偏移量的设计来实现随机的地形图

# 应用场景

  • 地形生成:用来生成自然的山脉、山丘等地形。
  • 纹理合成:生成平滑的纹理,如云层、烟雾等。
  • 动画效果:模拟流动的水、火焰等自然效果。

# 代码示例

row
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using UnityEngine;

[RequireComponent(typeof(LineRenderer))]
public class PerlinNoiseLine : MonoBehaviour
{
private LineRenderer lineRenderer;

[SerializeField] private float frequency = 0.5f;
[SerializeField] private float amplitude = 1.0f;
[SerializeField] private int pointCount = 100;
[SerializeField] private float lineWidth = 0.1f;

// 添加一个随机偏移
private float randomOffset;

void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.startWidth = lineWidth;
lineRenderer.endWidth = lineWidth;
lineRenderer.positionCount = pointCount;

// 初始化随机偏移
randomOffset = Random.Range(0f, 100f);

GeneratePerlinNoiseLine();
}

private void GeneratePerlinNoiseLine()
{
Vector3[] positions = new Vector3[pointCount];

for (int i = 0; i < pointCount; i++)
{
float x = i * 0.1f;
// 在 Perlin Noise 计算中加入随机偏移,使每次生成的曲线不同
float y = Mathf.PerlinNoise(i * frequency + randomOffset, randomOffset) * amplitude;
positions[i] = new Vector3(x, y, 0);
}

lineRenderer.SetPositions(positions);
}
}