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

Unity教程——simplex噪声(中)

2016年11月27日 16:40:32730蛮牛网

2D

二维噪声,我们可以可视化看到衰减。在我们的一维方法中,就包括Y相同的方式,这里我们使用X。

 Unity教程——simplex噪声(中) 资源教程 第1张

我们现在看到的每平方角径向衰减,沿主对角线。然而,那些角落本身并不是白色的。这是因为从其他角落的衰减作用是消聚集在这一点上,这是不可能发生在一维的。我们不想消减,所以只包括他们的时候在大于零时候。

Unity教程——simplex噪声(中) 资源教程 第2张

Unity教程——simplex噪声(中) 资源教程 第3张

当然,我们不想要正方形,我们想要三角形。那么,我们如何确定哪个三角形包含一个样本点,以及我们如何定位三角形的角?我们知道,二维空间可以划分成等边三角形。我们也知道,二维空间可以用正方形贴面,我们已经用了很多。如果我们可以两面之间转换会变得很方便。

如果你沿着对角线分割一个正方形,你最终会有两个三角形。这些都是正确的和等腰三角形。如果你要压缩那些三角形沿同一对角线,在某些时候他们会成为等边。所以如果我们斜方形网格的适量和分割正方形,我们会得到等边三角形网格。

沿着主对角线缩放意味着我们需要找出沿着这条线的每一点所在的位置。任意点<x,y >这等于x加y下降尺度本身可以通过减去了(x + y)从点的部分得到。我们要选择缩放因子s,我们得到了等边三角形。

让我们考虑一个= < 0,0 >,B = < 1,0 >,和C = < 1,1 >的三角形。A不会改变,但其他两将转化为B = <1 - s, -s>和C = <1 - 2s, 1 - 2s>。得到一个等边三角形,所有三角形的三边的长度必须是平等的。

对于任何三角形的距离从A到B的或简单的| AB |是1。B和C之间的距离| BC |是| B |相同,所以我们可以忽略的那一个。从A到C的距离或简单|AC|距离是√2。对转化后的三角形这些长度是未知的。

我们不得不为这样的尺AB| = |AC|后找到一个值。或者,我们可以把平方长度 |AB|2 = |AC|2,这意味着我们不必用平方根的工作。一点<x,y >只是 x2 + y2。

我们有 |AB|2 = (1 - s)2 + (-s)2 = 2s2 - 2s + 1.

也有|AC|2 = 2(1 - 2s)2 = 8s2 - 8s + 2.

解6s2 - 6s + 1 = 0。利用二次公式,我们结束了两方案=(3±√3)/ 6。我们有两个解决方案是有意义的,因为你可以创造一个正的和负的等边三角形。保持积极的态度,我们简单选择最小的解决方案,这是(3√3)/ 6。

但是,我们如何转换另一个方式,从三角形到正方形?这样,考虑转换点它要从<x + 2sx, y + 2sy>到< 1,1 >,我们必须找到。

我们有 x + 2sx = 1也就是 s = 1 / 2x - ½.,也有 x = 1 - 2((3 - √3) / 6)相当于√3 / 3 or 1 / √3,我们得到了s = 1 / (2 / √3) - ½ = (√3 - 1) / 2

现在我们终于有了我们的转换因子。

所以,要简单地计算出我们所处于的三角形,我们首先倾斜的网格,所以它成为正方形。我们确定的格点,我们使用部分的方法。

为确定它们的距离对于得到实际的角点,我们必须调正他们。

我们现在看到两个等边三角形组成的菱形而不是正方形变形。我们也看到,没有足够的的衰减。它目前达到零当距离一个单位,而它应该这样做的距离是等于我们的三角形的高度。

等边三角形的高度等于其边缘长度乘以√3 / 2。因此,我们必须确定其边缘的长度。我们已经知道, |AB|2 = 2s2 - 2s + 1 , s = (3 - √3) / 6,,导致 |AB|2 = ⅔.。这是方块的长度,因此实际边缘的长度是 √⅔ or √6 / 3。这意味着三角形的高度√½ or √2 / 2。

所以我们的衰减方法达到零当平方距离达到½时候。这意味着我们要用½ - x2 - y2为基础,而不是1 - x2 - y2。

当然,这也意味着减少从开始½3 = ⅛,所以我们不得不放大结果补偿。

下一步是确定我们所处于的两个三角形中的哪一个,要么是底部,要么是顶部的三角形。这是很容易做的矩形网格内。如果我们的X坐标的分数大于或等于Y坐标的分数,那么我们在底部三角形。这个三角形有相对的角坐标< 0,0 >,< 1,0 >,和< 1,1 >。另一个三角形位于上面,并有一个角坐标< 0,0 >,< 0,1 >,和< 1,1 >。由于我们已经包括沿主对角线的角落,我们只需要添加一个缺少的角。

要将其转换为真正的值噪声,我们必须将哈希值转换为到结果中。

最后一步是调整大小。

Unity教程——simplex噪声(中) 资源教程 第4张

正如你所看到的,二维的单值噪声看起来像是放置在一个三角形或蜂窝网格中的球体。它显示了相同的散列模式,作为二维值噪声,但斜沿主对角线。

3D

我们可以将我们用于2D方法用到三位总,但在这种情况下,我们用立方体、四面体的工作。然而,这是不可能的3D空间中的正四面体来贴面。我们要做扭曲的四面体,这意味着不是所有的边都有相同的长度。

一个立方体可以拆分为六个四面体就像一方可以被分为两个三角形。每个四面体有一沿立方体的主对角线,从< 0,0 > < 0,1,1,1 >。如果你必须按照立方体的三个边缘,你可以在这两个点之间走多少路?六种方式,各确定三个边四面体。此外,每个四面体有沿相邻立方体对角线两边的面。

Unity教程——simplex噪声(中) 资源教程 第5张

因此,我们开始与三个不同的边缘长度。让我们考虑四面体是由四点=<0,0,0 >定义,B =<1,0,0 >,C =<1,0,1 >,和a<1,1,1 >。应用一个未知的比例因子,我们得到了三个转化点。

B = <1 - s, -s, -s> 用|AB|2 = 3s2 - 2s + 1.

C = <1 - 2s, -2s, 1 - 2s> 用 |AC|2 = 12s2 - 8s + 2.

D = <1 - 3s, 1 - 3s, 1 - 3s> 用|AD|2 = 27s2 - 18s + 3.

Unity教程——simplex噪声(中) 资源教程 第6张

Unity教程——simplex噪声(中) 资源教程 第7张

让我们尝试|AB|2 = |AC|2。这推出了 9s2 - 6s + 1 = 0 ,S =⅓。我们得到四边形的长度了吗?|AB|2 = |AC|2 = ⅔,,和 |AD|2 = 0。这不行,我们已经把四边形折叠成三角形。

所以,让我们尝试|AB|2 = |AD|2代替。这得到14s2 - 16s + 2 = 0,s = ⅙。这给了我们|AB|2 = |AD|2 = ¾,和 |AC|2 = 1。这可以工作,并使最短和最长的边缘相等的匹配我们在二维中所做的。

最后的选择是尝试|AC|2 = |AD|2。这导致 15s2 - 10s + 1 = 0 和 s = (5 - √10) / 15。结果 |AB|2 = ⅘,= |AC|2 = |AD|2 = 1 + ⅕。这也可以工作,虽然边缘长度之间的差异较大。

所以,让我们用⅙规模因素从立方体到四面体。这些四面体是由四个等腰三角形。每个三角形都有一个长边长度1和两个短边长度√¾或√3 / 2。

在其他方向的尺度,考虑转换点D.这次我们有X + 3sx = 1的一个组成部分,x = 1 - 3(⅙) = ½。所以S =⅓。

我们刚才复制的二维代码,移除三角校验,添加第三维度,换上我们新的比例因子,并看看会发生什么。

Unity教程——simplex噪声(中) 资源教程 第8张

Unity教程——simplex噪声(中) 资源教程 第9张

Unity教程——simplex噪声(中) 资源教程 第10张

衰减看起来不错。检查三角形的几何显示我们四面体的高度是√½。因为和我们的二维的情形一样,我们不需要调整衰减。这也恰好等于一个边长√¾正四面体的高度。

现在,我们需要确定我们的四面体。这和二维相同,但现在我们必须比较三个组成部分,而不是两个。因此,让我们开始找出最接近的一个角落在主轴上。

要得到第四个和最后一个角落,我们必须重复这个过程,并添加第二个最接近的角落.

我们再次得到一个三角形的网格,但它看起来不像二维网格。这是因为四面体不与任何三个主要轴对齐。他们跟随主对角线,所以你看到一个倾斜的切片通过四面体抽样时的轴线平面,导致明显的对角起伏。

那么,哈希值呢?

别忘了调整结果的大小。

Unity教程——simplex噪声(中) 资源教程 第11张

不像普通值噪声,这种模式并没有真正改变外观,沿着Z轴,在对角线逐渐圆滑。但它不会替代模糊和锐利的结果之间在经过格界限。事实上,这确实发生了,只是不是一次。相反,你得到了沿对角线的尖锐和模糊的边界。它就像是基于超立方体的值噪声,围绕X和Y.旋转。

Unity教程——simplex噪声(中) 资源教程 第12张

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