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

Unity教程——Simplex噪声(上)

2016年11月23日 20:55:351160蛮牛网

implex噪声,保持简单

 Unity教程——Simplex噪声(上) Unity3D教程 第1张

在本教程中,您将创建Value 和 Perlin噪声的替代品,被称为Simplex噪声。你将学会使用基于距离衰减函数转换一个正方形和一个三角形网格;

立方体和四面体网格之间的转换;

计算Simplex Value噪声,三维,用导数。

计算Simplex Gradient噪声,三维,用导数。

本教程是Noise 和 Noise Derivatives的后边的教程。我想你还是先看那些,因为我们会使用其中代码。

本教程是 4.5.2。它可能不会为旧版本工作。

简化噪声

在Noise 和 Noise Derivatives的教程我们使用伪随机噪声的彩色纹理,变形,表面平整,粒子流和动画。我们创建了两种形式的方格噪声,插值的网格线的交点之间的。我们选择使用一个超立方体网格,一维的网格,二维的正方形网格,三维的立方体网格,因为它是一个明显的和简单的分区空间的方法。

我们创建的Value噪声,通过定义每个方格点的散列值,并顺利地内插它们之间。我们通过插值梯度代替固定的值创建Gradient噪声,这是最经常被称为Perlin噪声。

你可以产生非常好的效果,使用这些噪声类型,但他们有一定的局限性。当他们是基于一个超立方体网格,你将能够检测到方形图案,如果你仔细看一看。此外,当移动一个轴对齐的二维切片通过三维噪声,你会看到一个明显的变化,用噪声替换的立方体边缘和中心。由于三次插值,一个立方体的中心是更加模糊。最后,分析导数工具是很难计算和更高的尺寸得到更快。4D噪声需要精确的网格,这意味着你要每样16点插值。

用Simplex网格

我们不需要使用超立方体网格,我们所需要的是一种方法来划分空间到规则块。理想情况下,我们会使用最小的可能的形状为我们的网格单元,这将是一个单一的。对于一维,这是一个线,所以它没有什么区别。对于二维,它是一个三角形,而不是一个正方形。3D是一个四面体代替立方体。和4D是一个五胞体而不是一个精确的图形。这意味着,只有尺寸考虑1 + N点,而不是为2的n次方。

递减替换插值

我们怎么会有一个一个简单图像角之间的插值?事实上,我们不需要插值,我们可以减少一个角落,根据其从采样点的距离。2D,这将是一个径向衰减功能,应降为零达到三角形侧时。3D将球面衰减,等等。

使用衰减而不是插值的一大优势是,每个点是独立的。他们只是添加在一起,以获得最终的值。这简化了导数工具的计算。

你可以使用这种方法,一个超立方体网格,但径向衰减在四边形不如三角形效果好。

Simplex噪声

用衰减函数的一个单一的网格计算梯度噪声首先是由Ken Perlin提出的作为他之前发明的一种梯度噪声替代。大多数人把这个称为单纯的噪音,所以让我们以相同的名称为我们的基于单一的梯度噪声。我们用Simplex Value噪音来表示从基于超立方体的Value噪声。

我们将在前面的教程的后边,所以开始Noise Derivatives的项目教程。

Simplex Value噪声

让我们再次开始Value噪声,因为它是简单的比梯度噪声。然而,在我们开始记住,我们已经到目前为止,作为一种特殊的情况下的噪声。这是因为它有一个范围为0 - 1,而梯度噪声有一个范围为- 1 - 1。因此,我们应该更新我们的代码,也使单一的值噪声的例外。另外,我们可以做的特殊情况下,完全如果我们改变我们的价值的范围- 1 - 1。让我们这样做,只是因为我们可以。

第一, 调整的Value1D,Value2D结果,在噪声Value3D方法。去掉一个。

然后移除在TextureCreator, SurfaceCreator, and SurfaceFlow检测对于值噪声。在采取了噪音样品后,我们现在总是取值一半。

Unity教程——Simplex噪声(上) Unity3D教程 第2张

为了保持texturecreator在0–1范围内,添加½。

Unity教程——Simplex噪声(上) Unity3D教程 第3张

用这种方法,在噪声脚本的顶部添加我们的新的噪声类型。

Unity教程——Simplex噪声(上) Unity3D教程 第4张

现在我们可以添加占位符方法及其阵列的方法,包括它的方法收集。这允许使用在我们可以选择Simplex Value噪声。

Unity教程——Simplex噪声(上) Unity3D教程 第5张

1D

我们开始考虑只是一个维度,它保持简单。在这种情况下,单一和超立方体网格是相等的,所以我们只抓住样本点的整数部分,以得到它的左边的格点。

Unity教程——Simplex噪声(上) Unity3D教程 第6张

让我们看左边的线性片段。它应该开始是一个值,之后下降到零,当我们达到右边时,就像有规律的Value噪声。再一次,我们要确保衰减函数下降到零和一阶导数和二阶导数。不同的是,导数不需要在开始时为零,他们只是需要连续。

除了这些考虑,我们希望一个函数,可以工作在任何维度,基于网格的交叉点的距离。虽然我们可以计算实际的距离,这将需要执行一个更高的维度的平方根操作,我们避免这样做。因此,我们用距离平方,不是吗?如果是这样的话,我们会自动得到一个径向对称衰减。

最简单的衰减会1-X2。一阶和二阶导师是-2x和-2,而不是零当X是一个一阶函数。如果我们平方的函数的话怎么办?然后我们得到(1- x2)2,仍降到零的时候。它的导数是 -4x(1 - x2),并降为零,-4(1 - x2) + 8x2不是。我们试试立方版,(1 - x2)3。一个导数是-6x(1 - x2)2 and -6(1 - x2)2 + 24x2(1 - x2)都降到零。

所以(1 x2)3是我们的衰减函数。让我们一步一步来计算它,并将它可视化。也别忘了,我们必须将最终结果转换为- 1 - 1范围。

现在的想法是,我们可以计算这两个结束点,简单地相加结果。因此,让我们把代码来计算一个单独的方法的结果的一部分,并用两次,所以我们得到了两端。

正如你所看到的,结果是在线段的终点处的全部强度和他们之间最薄弱的一半。这种差异变得更加明显,在更高的维度。

所有剩下的将它变成Value噪声是用哈希值。

Unity教程——Simplex噪声(上) Unity3D教程 第7张

Unity教程——Simplex噪声(上) Unity3D教程 第8张

最终的结果看起来很像普通插值噪声,但衰减函数产生更多条带。当然,我们还必须包括导数的计算,稍后再说。

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