Skip to main content
 首页 » 资源教程 » Unity3D教程

Unity教程——simplex噪声(下)

2016年11月29日 22:17:07891050蛮牛网

导数

那么,导数呢?幸运的是,他们是相当简单的。衰减函数的导数(1 - x2)3 是 -6x(1 - x2)2。因子的哈希值,你有了一维导数。

Unity教程——simplex噪声(下) Unity3D教程 第1张

请输入图片描述

请输入图片描述

当然,我们仍然需要调整的频率,所以做这个事情,然后返回的最终结果。事实上,这样做的二维和3D的事情一样,所以我们不会忘记。

Unity教程——simplex噪声(下) Unity3D教程 第2张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第3张

请输入图片描述

对于两个维度,我们可以使用完全相同的方法。导数组件之间的唯一区别是乘法的组件。由于公式的其余部分是相同的,我们不妨计算一次。

Unity教程——simplex噪声(下) Unity3D教程 第4张

请输入图片描述

这就像三个维度一样简单。

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第5张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第6张

请输入图片描述

梯度噪声

是时候处理Gradient Simplex噪声,我们命名Simplex噪声。因此,我们添加了一个新的噪声类型。

当然,我们调整方法。

现在复制和重命名Simplex Value方法。确保你有他们自己的部分方法调用。我只显示了一维的情况下的变化。

1D

继续与一维,我们现在必须检索一个一维的梯度,而不是只是的散列值。与Perlin噪声,我们计算梯度值的梯度向量的点积和从角落里我们的样本点的向量。对于一维,这是一个简单的乘法。

再一次,正如Perlin噪声,梯度现在已经包括衰减乘以梯度矢量

现在我们必须确定噪声的最大值。像Perlin的声音,并达到最大值一半时沿线段两端的梯度指向对方。这意味着最大的 2x(1 - x2)3, x = ½,这是27 / 64。因此,我们必须用这个值来划分最终的结果,这意味着乘以64 / 27。

2D

它是相同的对于二维,得到的梯度向量,计算点的数据,包括他们的值和导数。

问题是现在哪里是最大值,在边缘还是中心?两个都计算一下

记住,边缘的长度是√⅔或√6 / 3。所以在边缘得到2x(½ - x2)3 , x = √6 / 6,是√6 / 81。

其次,从一个角落一个等边三角形的中心的距离等于它的边长乘以√3 / 3 or √⅓。所以在中心得到3x(½ - x2)3 x =√2 / 3,这给了我们125√2 / 5832。由于这个值是比另一个小的一点,它是我们理论最大值。其乘法逆可以写成2916√2 /  125,所以这是我们最后的大小。

现在,我们需要最后的因子,我们就完成了。

一个额外的问题是,我们是否实际上涵盖了整个- 1 - 1范围,因为我们没有考虑我们只使用八个梯度向量。事实证明,我们的45度旋转梯度向量产生的最大值,可以得到非常接近- 1和1。所以是的,我们有效地覆盖了整个范围。

3D

这也应该在三维中能行

Unity教程——simplex噪声(下) Unity3D教程 第7张

请输入图片描述

为了获得最大的值,在我们扭曲的四面体短边中间是好的。我们显然不会发现在更长的边缘上的最大值。在一个规则的三角形的情况下,中间和中间的边缘之间的差异是非常小的。把它变成一个直角三角形,只增加了两个角之间的距离,所以面中部也在外面。对四面体的中心的距离是更大的,所以我们也可以忽略它。

Unity教程——simplex噪声(下) Unity3D教程 第8张

请输入图片描述

最短边长度是√3 / 2,我们得到2x(½- X2)3 x =√3 / 4,最终被125√3 / 8192。倒数可以写为8192√3 / 375,所以这是我们的尺度因子。

事实上,因为我们的三维梯度阵列包含√2向量的长度必须通过我们的分母补偿。

Unity教程——simplex噪声(下) Unity3D教程 第9张

请输入图片描述

在做了乘法以后,我们可以检查出噪音。

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第10张

请输入图片描述

它看起来很好,但事实证明,我们目前的设置的梯度向量不填充整个范围。最大振幅似乎是大约0.85,而不是1。我们怎么能解决这个问题?

我们知道,所有的四面体有一个自己的短边与主对角线对齐。因此,如果我们包括沿主对角线的两个相反的向量,我们可以覆盖整个- 1 - 1范围。

梯度阵列我们目前使用的是由Ken Perlin设计的。它包含指向多维数据集的十二个边缘中间的向量。其中的四个被复制,以增加数组的大小到16。

要包括主对角线,我们必须向多维数据集的两个角点添加向量。为了保持对称,我们应该添加所有的八个角矢量。十二个边加八个角给我们二十个向量,这不是两个因素。然而,如果我们包括两次边缘,我们最终有32个向量。要保持他们所有的相同的长度,我们必须使他们标准化。

Unity教程——simplex噪声(下) Unity3D教程 第11张

请输入图片描述

现在我们可以使用这些新的梯度,而不是那些由Perlin噪声。

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第12张

请输入图片描述

我们不再需要除以√2。

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第13张

请输入图片描述

有了这个,我们的噪音覆盖了整个范围。

Unity教程——simplex噪声(下) Unity3D教程 第14张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第15张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第16张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第17张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第18张

请输入图片描述

Unity教程——simplex噪声(下) Unity3D教程 第19张

请输入图片描述

这就是怎样做Simplex噪声

评论列表暂无评论
发表评论