Perlin Noise
这里有一片文章不错
http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
原文是英文,要点翻译在这里。
有一些应用,需要随机生成一些数。比如用来控制运动,行为或者生成贴图什么的。但是单纯的生成随机数的方法常常会使得输出不那么自然。所以,我们需要Perlin Noise。
很多自然现象,事物都有这样的特点。它们看起来是随机的,但是这种随机是分粒度分布的。不同粒度的变量组合起来,构成整个的随机过程。比如山高度,高山(mountain)的高度,粒度很大,中型山(hills)小些,巨石(boulder),小石头(stone)粒度就更小。其它很多东西,比如草原,海浪,风神马的,都是如此。Perlin Noise的原理就是把这些不同粒度的变量相加,创造合乎自然规则的随机形态。
Perlin Noise分两部分:噪声函数(Nosie Function),插值函数(Interpolation Function).
【Noise Function】
Perlin Noise里的Noise Function其实就是一个函数式,有一个输入就有一个输出。如果输入是固定的,那么输出也是固定的。这一点在Perlin Noise里很重要。
在二维坐标系里用x坐标表示输入,用y坐标表示输出。那么当x取离散值的时候(比如0,1,2),我们得到的是一些在平面上的点。通过某种插值方法,我们可以得到一个连续的曲线(由于Y值是随机的,所以曲线应该是弯弯曲曲的)。
那么Noise Funciton里怎么体现本文开头所说的变量的粒度呢?答案是选择不同的振幅和频率(振幅和频率,请回想sin函数曲线的知识)。采用不同粒度的振幅和频率,计算出若干Noise Function,并且把它们的结果相加,就能得到我们想要的"自然的"随机形态。
那么振幅和频率一般怎么取值呢?这里有一个Persistence的概念。
用Persistence和Noise Function的索引来决定振幅和频率(这应该是一种经验公式)
频率 = 2^i
振幅 = persistence ^ i
其中i是Noise Funciton在一系列准备相加的Noise Funciton里的索引。这里的一个Noise Function还有一个专门的名字,叫做Octaves。这是因为在这个经验公式里后一个Octaves的频率总是前一个的2倍。关于这个经验公式的效果,请看原英文文章里的图。
说了半天还没说这个Noise Function到底怎么实现。前面说了,Nosie Fucntion要求对于同样的输入,输出必须相同,因此用简单的随机函数是不行的。所以下面是一个实现,不知道是谁发明的:
function IntNoise(32-bit integer: x)
x = (x<<13) ^ x; return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end IntNoise function
【插值(Interpolation)】
一般来说Noise Function接受一系列离散的数字,如果想得到两个输入之间的输出值,那么就把两个输入得到的结果做插值来得到连续的输出结果。
常用的插值方法有
Linear Interpolation
Cosine Interpolation
Cubic Interpolation
【Smoothed Noise】
以下略
浙公网安备 33010602011771号