3.3 噪声与模式生成


3.3 噪声与模式生成

本节摘要:噪声是程序化自然的"随机语法":白噪声无记忆、值噪声连续、分形噪声叠加多个倍频呈现自然细节。本节用 Wrangle 逐一可视化几种噪声的断面波形,讲清频率、倍频、粗糙度三个参数的视觉意义,以及 Voronoi 与噪声的分工。

实验:把噪声画出来

最直观的观察法——造一条线,把噪声值当高度。Grid 换成 Line(或 Curve 拉直),撒 500 点后接 Wrangle:

// 沿 x 轴展示一维噪声断面 float x = @P.x * chf('freq'); // freq 默认 1 @P.y = noise(x); // 值噪声:连续、平滑

noise 依次换成 rand(x)(白噪声)与手写分形(下文),同一条线上对比三种波形。

图 3.3-1 三种噪声的断面形态

图 3.3-1 三种噪声的断面形态

频率、倍频、粗糙度

Houdini 噪声类节点(以及多数软件的分形噪声)共用的三个旋钮:

  • 频率(freq):波浪的密与疏。乘在采样坐标上——noise(@P * 2) 频率翻倍。地形上:低频造大山势,高频造碎石感;
  • 倍频数(octaves):叠加几层频率翻倍的噪声。1 层光滑,6 层细碎。每加一层计算翻倍;
  • 粗糙度(roughness/lacunarity):高层相对低层的幅度衰减。接近 1 时高频与低频一样强(很糙),接近 0 时只剩大形。

手写一遍分形,三个参数的作用立刻具体化:

// 分形布朗运动的等价实现(教学版) vector p = v@P * chf('freq'); float amp = 1.0, sum = 0.0, norm = 0.0; for (int oct = 0; oct < chi('octaves'); oct++) { sum += amp * noise(p); norm += amp; p *= 2.0; // 频率翻倍 amp *= chf('roughness'); // 幅度衰减 } f@fuzzy = sum / norm; // 归一到约 -1~1

噪声家族选型

类型 特征 典型用途
均匀随机 rand 无连续性 抖动、抽样、打乱
值噪声 noise 连续、 blobby 位移、密度调制
柏林系(新版本可选) 连续、方向性自然 地形大势
Simplex/Aalligator 等变体 特征纹路不同 皮肤、矿物纹理
Voronoi 细胞状、硬边 龟裂、鹅卵石、细胞图案
curl noise 旋度场,无散度 烟、流体风场驱动的粒子

Voronoi 与普通噪声的分工:连续渐变用噪声,离散区块用 Voronoi。第 5 章破碎(刚体裂块)正是 Voronoi 的另一面——同一数学,两个用途。

⚠️ 常见坑:直接 noise(@P) 不加缩放就当位移用——默认频率下噪声跨度与场景尺度不匹配,位移看起来像随机疙瘩。先问场景尺度,再定频率;10 单位宽的地形,基础频率通常在 0.05~0.3 之间起步。

💡 关键直觉:噪声是场的语言。你几乎从不直接"看"噪声,而是把它采样成位移、密度、遮罩、颜色。学噪声=学"把场映射到几何属性"这件事。

本节要点回顾

  • 三参数:频率定疏密、倍频定层次、粗糙度定衰减;
  • 分形=多倍频加权叠加,手写一遍胜过读十遍;
  • 连续用值噪声、区块用 Voronoi、流场用 curl
  • 频率要匹配场景尺度,默认值几乎总是错的;
  • 噪声的产物是"场",一切属性都可以由场驱动。

下一章把噪声放到它最大的舞台上:高度场地形。

延伸:分形和粗糙度的调音实验

Houdini 噪声函数有四个旋钮,各管一个维度:频率(特征尺寸)、倍频 octaves(细节层数)、粗糙度 lacunarity/roughness(层间幅度衰减)、种子(相位)。做一次系统对拍,把四张截图钉在工位上:

// Anechoic 风格的地形噪声: ridged 分形 + 域扭曲 vector q = @P * ch("freq"); float warp = aanoise(@P * ch("warp_freq")) * ch("warp_amt"); float n = ridgednoise(q + warp); n = fit(n, -1, 1, 0, 1); @P.y = pow(n, ch("gamma")) * ch("height"); // gamma 控制山峰锐度

warp 域扭曲是噪声进阶的分水岭:它把"格子的随机"变成"流体的随机",岩石纹理、河道走向都靠它摆脱数字感。调参口诀——先定 freq 再加 octave,warp 最后上且从 0.1 起步。

廕伸:模式生成的细胞自动机

// Solver 内 (Run Over: Points): 一维元胞自动机向图案的迁移 int state = i@s; int left = point(1, "s", (@ptnum - 1) % npoints(1)); int right = point(1, "s", (@ptnum + 1) % npoints(1)); int rule = chi("rule_number"); // 0-255 = 全部一维规则 int idx = left*4 + state*2 + right; i@s = (rule >> idx) & 1; // 查表演化 // 规则30 => 混沌纹理; 规则90 => 谢尔宾斯基三角

噪声管"自然的随机",模式管"规则的涌现";两者相乘(噪声控制图案的位置权重)是程序化表面细节的万能配方。

最后提醒噪声使用的法律边界式纪律:凡是用在最终交付物上的噪声,参数(含种子)必须登记进资产的参数面板而非留在 Wrangle 字面量里。原因很实际——艺术总监说"这片山的感觉对了,换到那边去"时,你要做的是复制一条已参数化的噪声管线,而不是在代码里翻找硬编码的 0.37。噪声是程序化的"指纹"来源,指纹必须可查档;养成把每个 magic number 提升为 ch() 的反射,是第三章所有技术的共同卫生要求,也是最便宜的专业化步骤。

噪声章的最后一条实战经验:永远保留一份"参数对照截图墙"。把你的项目用过的每种噪声配方(函数、参数、效果截图)归档成图库,标注适用场景——山脊用 ridged+warp、云海用Worley 膨胀、木纹用各向异性拉伸的简单噪声。这份图库的价值在于沟通:艺术总监指着截图说"要这种"的时刻,你能直接落到具体配方而非重新摸索。程序化团队的风格资产,一半在 HDA 里,另一半就在这类对照档案里。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U