-1

首先,我是在这里提问的新手(尽管我已经潜伏了很长一段时间)所以如果我没有正确格式化或用词,请原谅我。
其次,我不是在寻找任何库的链接(就我个人而言,我不喜欢它们,因为我无法访问源代码......而且,在我看来,它们感觉像是一个潜在的安全漏洞等待发生),我只是在使用普通的旧 C 代码来完成所需的任务(最好不使用对象/结构)。


我正在尝试生成二维噪声,但我似乎遇到了障碍。

我已经编写了自己的伪随机数生成器,你给它种子/输入值,它总是为相同的种子/输入提供相同的输出(从 0.0 -> 1.0)。换句话说,它可以愉快地产生确定性的一维噪声。
使用这种方法,我可以创建单独的 x/y 噪声轴(我会发布示例图像来说明我的意思,但我需要 10 个代表点来发布图像......但只要说它们看起来像黑色/灰色就足够了/white 条码水平/垂直方向)
但是我努力结合到两个轴导致图像类似于黑白“格子呢”类型的图案(同样,如果可以的话,我会发布演示图像)。我追求一种“蓬松的云”风格的图案,就像柏林噪音产生的那样。

我的目标是拥有一个函数,当提供种子/x/y 值时,它会提供所需的二维输出。

预先计算一组值(这是我在 Google 的几个地方找到的方法)在这里是不可能的。噪声将用于程序世界生成,二维输入坐标可以从 -1,088,391,168 到 +1,088,391,168(对于 x 和 y 轴,这将是 (4*(10^18)) 字节) ...因此输出必须直接取决于给定和即时计算的输入值。


我的问题是:给定两个单独的一维噪声轴(x 轴/y 轴),我如何将两个轴组合成一个二维噪声值?或者换句话说,我怎样才能将我的水平和垂直条形码组合在一起来创建一个二维噪声场?


编辑:

const double noise_x1 = Noise(seed, x);
const double noise_x2 = Noise(seed, x + 1);

const double noise_y1 = Noise(seed + 1, y);
const double noise_y2 = Noise(seed + 1, y + 1);

这将获取 x/y 轴的噪声值,以及下一个 x/y 点的噪声值。如何在数学上组合这 4 个值以用作“网格单元”的“角”?我只是把它们平均起来吗?
例如:

const double noise_x1y1 = (noise_x1 + noise_y1) * 0.5;
const double noise_x2y1 = (noise_x2 + noise_y1) * 0.5;
const double noise_x1y2 = (noise_x1 + noise_y2) * 0.5;
const double noise_x2y2 = (noise_x2 + noise_y2) * 0.5;

那么在给定“单元格”内插入确切点的公式/算法是什么?
我见过其他人使用“基于网格的逻辑”来消除噪音,但这似乎让我感到困惑:P


更新(2014 年 10 月 30 日晚上 7:35,澳大利亚东部标准时间/AEST):

在深入研究这个问题后,我遇到了莫顿代码(它实际上与噪声函数无关,尽管它们可用于将输入坐标“散列”成一个数字)。莫顿代码交错两个输入数字的位,如下所示:
第一个输入数字...

00000001 -> 00000000 00000001 = 1  
00000010 -> 00000000 00000100 = 4  
00000100 -> 00000000 00010000 = 16  
00001000 -> 00000000 01000000 = 64  
00010000 -> 00000001 00000000 = 256  
00100000 -> 00000100 00000000 = 1024  
01000000 -> 00010000 00000000 = 4096  
10000000 -> 01000000 00000000 = 16384  

第二个输入数字...

00000001 -> 00000000 00000010 = 2  
00000010 -> 00000000 00001000 = 8  
00000100 -> 00000000 00100000 = 32  
00001000 -> 00000000 10000000 = 128  
00010000 -> 00000010 00000000 = 512  
00100000 -> 00001000 00000000 = 2048  
01000000 -> 00100000 00000000 = 8192  
10000000 -> 10000000 00000000 = 32768  

然后将这两个输出数字组合成一个数字。这个过程可以很容易地扩展为使用两个 32 位输入(形成一个 64 位输出)。

然后可以将输出数输入一维噪声函数,为任何 32 位输入提供确定性输出。

4

2 回答 2

0

只需使用这个:https ://gist.github.com/KdotJPG/b1270127455a94ac5d19

2D、3D 和 4D 噪声的定向伪影明显少于 Perlin 噪声,尤其是与您尝试执行的操作相比。

于 2014-10-30T05:58:39.887 回答
0

获得真实的、确定性的 xD 噪声的最简单方法是使用一些哈希函数将坐标组合在一起:

  1. 将坐标转换为所需粒度的整数。

  2. 将整数散列在一起。您的要求介于用于哈希表的简单函数和加密哈希产生的过度杀伤力之间。你在哪里妥协完全取决于你,所以我不能就使用哪个散列函数给出太多建议。

  3. 将生成的哈希转换为 0 到 1 之间的浮点数。

于 2014-10-30T06:29:02.230 回答