2

我环顾四周,似乎大多数人将它用于纹理,我发现自己一直在试图弄清楚如何将 Perlin/Simplex Noise 实现到一组二维坐标 x 和 y。

我要做的就是输入 2 个随机坐标 x & y,然后它返回一个改变的 x & y,或者这不可能吗?

我正在使用python噪声来创建坐标,但我发现柏林噪声很难理解并且无法完全理解它是如何工作的。

4

1 回答 1

2

可以使用 Perlin Noise 为 2D 坐标的集合添加一些不确定性(如果集合是一对,那也很好)。您可以考虑返回的噪声值(在指向库的 [-1, 1] 范围内)以及一些因素来确定它对输入坐标的影响程度。因子越大,噪声对数据的影响就越大。这是最简单的示例之一:

from noise import snoise2 # Simplex noise for 2D points

x, y = 0.5, 0.3
factor = 0.1
n = snoise2(x, y)
print x + n * factor, y + n * factor

我们还可以考虑更大的因素并将相同的想法应用于图像。考虑factor = 15并将结果坐标四舍五入到最近的邻居,我们从左边的图像到右边的图像:

在此处输入图像描述 在此处输入图像描述

获取图像的完整代码如下。这些因素n1n2用于获得“不那么无聊”的图像。

import sys
from noise import snoise2
from PIL import Image

img = Image.open(sys.argv[1]).convert('L')
result = Image.new('L', img.size)
width, height = img.size

factor = 15
res = result.load()
im = img.load()
for x in xrange(width):
    for y in xrange(height):
        n1 = snoise2(x, y)
        n2 = snoise2(y, x)
        pt = [int(round(x + n1 * factor)), int(round(y + n2 * factor))]
        pt[0] = min(max(0, pt[0]), width - 1)
        pt[1] = min(max(0, pt[1]), height - 1)
        res[x, y] = im[tuple(pt)]
result.save(sys.argv[2])

当然,这甚至没有涉及如何使用 Perlin Noise。再举一个例子,给定一个特定的函数,你可以对输入进行“噪声化”,并结合上述因素来创建不同的输出。例如,这是对基于余弦的某个函数执行此操作的结果:

在此处输入图像描述

于 2013-02-19T19:33:09.343 回答