Perlin用伪代码解释:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
本教程为我提供了用伪代码编写的随机数生成器函数。返回范围为(-1,1)的浮点数。
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
因此,如果此函数返回范围为(-1,1)的数字,我是否只能使用
random.uniform(-1, 1)
?但是后来我遇到了这个问题:
function Noise(x)
.
.
end function
function SmoothNoise_1D(x)
return Noise(x)/2 + Noise(x-1)/4 + Noise(x+1)/4
end function
我猜想
Noise(x)
函数会为1D噪声生成随机数。我似乎无法理解
x
参数是什么。是种子吗?而且,我不能使用
random.uniform(-1, 1)
最佳答案
Perlin噪声中使用的噪声函数是种子随机数生成器。也就是说,每次使用参数X的相同值调用该函数时,它都必须返回相同的值。您可以将X视为要计算Perlin噪声的区域边界之间给定维度上空间中的某个位置。 。
如果您可以根据给定的参数重置RNG的状态,则可以使用Python随机模块,以便它对于给定的X始终返回相同的值。
import random
rand_state = random.Random()
def Noise(x):
rand_state.seed(x)
return rand_state.random()
>>> Noise(1)
0.13436424411240122
>>> Noise(2)
0.9560342718892494
>>> Noise(1)
0.13436424411240122
请注意,Noise在第一次和第二次传递1时返回相同的值。当输入非1的值时,它也会返回一个不同的值。种子的参数可以是Python中的任何可哈希类型。为了您的目的,任何数字类型都可以使用。
通常,在创建Perlin噪波时,会对该噪波函数进行多次调用,因此您希望它更快。在我的机器上,执行上述功能大约需要14微秒。每秒大约只有70万次通话。为IntNoise实现伪代码可能会导致更好的性能。实际上,以下方法:
MAX_INT = (1<<31)-1
def IntNoise(x):
x = int(x)
x = ((x << 13) & MAX_INT) ^ x
x = ( x * (x * x * 15731 + 789221) + 1376312589 ) & MAX_INT
return 1.0 - x / 1073741824.0
每次调用似乎平均要花费1.6微秒,比上面的“噪声”快10倍。它的返回值范围是(-1,1),但是可以通过修改最后一行来更改。我不能说它的分布均匀,但是,一张图片值一千字。下面的蓝点来自IntNoise,红点来自python random.uniform函数。
您的问题中的平滑噪声算法可以使用上面的噪声函数。您在问题中链接的URL描述了平滑功能比我能提供的更好的功能。阅读该段落后,研究其旁边的1D和2D平滑图片,以更好地了解其目的。
关于python - 我是否需要自定义随机数发生器以消除Perlin噪声?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23178631/