What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
vfx:houdini:concepts:noise [2019/04/26 08:56] – 创建 codingharevfx:houdini:concepts:noise [2021/11/11 08:08] (当前版本) codinghare
行 1: 行 1:
 ======Noises====== ======Noises======
 Houdini 中的 Noises 概念 Houdini 中的 Noises 概念
-===== =====+----
 Houdini 中有各式各样的 Noise 生成器。这些 Noise 通过不同的算法实现,在性能和表现上也有不同的差异。 Houdini 中有各式各样的 Noise 生成器。这些 Noise 通过不同的算法实现,在性能和表现上也有不同的差异。
 ====Noise 和 Random==== ====Noise 和 Random====
-在 Houdini 中我们可以通过 Random 和 Noise 来生成一些不规则的效果。但这两者最大不同之处在于,Random 采用了伪随机过程来生成结果,该结果通过 ''seed'' 来控制,生成的结果是不可预测的。从图像上来说,Random 呈现的曲线是一条充满着断点的,不光滑的曲线。对于我们来说,Random 是非常难以控制的,因此 Random 应该使用在需要随机的地方。+在 Houdini 中我们可以通过 Random 和 Noise 来生成一些不规则的效果。但这两者最大不同之处在于,Random 采用了伪随机过程来生成结果,该结果通过 ''seed'' 来控制,生成的结果是不可预测的。从图像上来说,Random 呈现的曲线是一条充满着断点的,不光滑的曲线。对于我们来说,Random 是非常难以控制的,因此 Random 应该使用在需要**完全随机**的地方。
 \\ \\
 \\ \\
 ===Houdini 中 Random 的种类=== ===Houdini 中 Random 的种类===
 Houdini 中的 Random 大致有三种: Houdini 中的 Random 大致有三种:
-  * random:通过N维空间中的位置信息来生成随机数,使用的 seed 是整型。 +  * //random//:通过N维空间中的位置信息来生成随机数,使用的 seed 是整型。 
-  * hscript_rand:该方法可以使用浮点数作为 seed 来生成随机数,结果可能跟操作系统相关。 +  * //hscript_rand//:该方法可以使用浮点数作为 seed 来生成随机数,结果可能跟操作系统相关。 
-  * n-random:n-random 会返回一个 ''[0,1]'' 之间的数。该方法并不使用 seed,因此不能重现之前的结果。因为这种特性,n-random 被称为**不确定随机数生成方法**(//non-deterministic random number generator//)。+  * //n-random//:n-random 会返回一个 ''[0,1]'' 之间的数。该方法并不使用 seed,因此不能重现之前的结果。因为这种特性,n-random 被称为**不确定随机数生成方法**(//non-deterministic random number generator//)。 
 +===大多情况下选择 Noise=== 
 +比起 Random,在实际生产中我们更倾向使用 noise,因为 noise 自身带有非常高的可控性。以 Perlin Noise 作为例子来说一下为什么是可控的。来看一看 Perlin Noise(1D) 的简单产生过程: 
 +  - 在 X 轴上按一定的间隔随机采样点 
 +  - 将这些点使用插值连接起来(比如 sin / cos) 
 +  - 再对 X 轴上的点进行间隔细分,进行每个点的随机采样 
 +  - 再将这些点使用插值连接起来,得到第二条光滑的曲线(//Octaves//) 
 +  - 然后将该曲线与之前的曲线相叠加 
 +通过以上的步骤,我们发现我们可以得到一种整体上平滑,但在局部上又有类似“分型(Fractal)” 形状的曲线。这样的曲线之所以易于控制,是因为其总体上来说可以看做是一种“波”,换句话说,我们可以通过**频率**(//Frequency//)、**位移**(//Offset//)、**粗糙度**(//Roughness//)等等来控制 Noise 的大致分布和细节。因此,对于某些需要一定的随机结果,但在大体上又应该有总体趋势的特效场景来说(比如城市里的汽车,有各种不同的车,但大部分都是本田和丰田),Noise 是非常有用的。 
 +====Houdini 中 Noise 的参数==== 
 +以 VOP 节点为例,Houdini 中有这么几个参数: 
 +  * //Frequency//,该参数代表了 Noise 的频率。越大代表 Noise 的“褶皱”就越明显。 
 +  * //Amplitude//,该参数是对 Noise 一个整体的缩放。 
 +  * //Roughness//,对 Amplitude 的叠加。 
 +  * //Attenuation//,控制 Noise 之间的衰减程度,越大越平滑。 
 +  * //Turbulence//,对 //Frequency// 进行叠加,不会在整体上改变 noise 的大致分布。 
 +====其他的 Noise==== 
 +Houdini 中的 Noise 大致分为两个部分:连续的 Noise 和 非连续的 Noise. 
 +\\ 
 +\\ 
 +===连续的 Noise === 
 +连续的 Noise 分为如下几类: 
 +  * Perlin:基于 lattice points(也就是之前说的细分点)的 Noise。波动比较平稳,波动范围大部分在 0 的附近。 
 +  * Simplex:与 Perlin 类似,振幅较 Perlin 更加大。在 2D 的分布中,simplex 会呈现等边三角形状的图案(Perlin 是四边形,参考[[http://weber.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf|//Simplex noise demystified, Simplex noise demystified, 2005//]])。Simplex 的效率较 Perlin 更高,形状更自然,几乎没有可以被人眼观测到的制造痕迹。 
 +  * Sparse Convolution:该类型 Noise 位置在 $0$ 以上,不会出现正负相减的波动。同时该种曲线非常平稳(resistant to change)。 
 +  * Sinusoidal:周期性的 Noise,比如 ''sin'', ''cos'' 等等。 
 +===非连续的 Noise=== 
 +非连续的 Noise 分为如下几类: 
 +  * Worley:这种曲线的主要特点是在波峰(Peak)处不是连续的。根据这个特点,Worley、Voronoi、Cell 这三种类型的 Noise 都可以归为此类。 
 +  * Alligator:这种 Noise 看起来像是心电图一样,其位置永远在 0 之上,而不连续的点处于靠近 0  的地方。 
 + {{:vfx:houdini:concepts:snipaste_2019-04-25_22-20-25-min.png|}} 
 +\\ 
 +\\ 
 +//Noise 1D 对比,图片来源:SideFX// 
 +\\ 
 +\\ 
 +{{:vfx:houdini:concepts:snipaste_2019-04-25_22-28-53-min.png|}} 
 +\\ 
 +\\ 
 +//Noise 3D 对比,图片来源:SideFX// 
 +===Noise 的效率=== 
 +^Noise type ^Relative cost^ 
 +|<color #900>Perlin noise (noise)</color> |1.0| 
 +|<color #900>Original perlin noise (onoise)</color>|1.1| 
 +|<color #900>Worley noise (wnoise)</color>|1.8| 
 +|<color #900>Sparse Convolution noise (snoise)</color>|2.1| 
 +|<color #900>Alligator noise (anoise)</color>|2.3| 
 +====参考资料==== 
 +  * [[https://www.youtube.com/watch?v=O33YV4ooHSo|Make some noise with Python and generate terrain]] 
 +  * [[https://vimeo.com/75313908|Working with Noise]]