首先,我刚开始在这里提问(尽管我已经潜伏了很长一段时间),所以如果我的格式或单词不正确,请原谅
其次,我不是在寻找指向任何库的链接(就我个人而言,我不喜欢它们,因为我无法访问源代码…而且,在我看来,它们感觉像是一个潜在的安全漏洞),我只是在寻找普通的旧C代码来完成所需的任务(最好不要使用对象/结构)。
我试图产生二维噪音,但我似乎遇到了障碍。
我已经编写了我自己的伪随机数生成器,在这里你给它种子/输入值,它总是为相同的种子/输入提供相同的输出(从0.0->1.0)。换句话说,它可以愉快地生成确定性的一维噪声
使用这种方法,我可以创建单独的x/y噪声轴(我会发布示例图像来演示我的意思,但我需要10个代表点来发布图像……但只要说它们看起来像水平/垂直方向的黑色/灰色/白色条形码就足够了)
然而,我的努力结合到两个轴已经产生了一个类似于黑色&白色"格子呢"类型的图案(同样,如果可以的话,我会发布演示图像)。我追求的是一种"蓬松的云"风格的图案,就像柏林噪音产生的那样。
我的目标是有一个单一的函数,当提供种子/x/y值时,它会给出所需的2-D输出。
预先计算一组值(这是我在谷歌上的几个地方找到的方法)是不可能的。噪声将用于程序世界生成,2-D输入坐标可以从-108391168到+108391168(对于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):
在进一步研究这个问题时,我遇到了Morton代码(它们实际上与噪声函数无关,尽管它们可以用来将输入坐标"散列"成一个数字)。Morton码交错两个输入数字的位,如下所示:
第一个输入数字。。。
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位输入提供确定性输出。
获得真实、确定的xD噪声的最简单方法是使用一些哈希函数将坐标组合在一起:
-
将坐标转换为所需粒度的整数。
-
将整数散列在一起。您的需求介于用于哈希表的简单函数和加密哈希产生的过度杀伤之间。你在哪里达成妥协完全取决于你,所以我不能就使用哪个哈希函数给出太多建议。
-
将生成的哈希转换为介于0和1之间的浮点值。
只需使用以下内容:https://gist.github.com/KdotJPG/b1270127455a94ac5d19
2D、3D和4D噪声的方向伪影明显少于Perlin噪声,尤其是与您尝试做的事情相比。