域扭曲
15 / 15
学习程序化噪声的基础构件与常见风格化手法。
Domain Warp 是用噪声来扭曲坐标、再对扭曲后的坐标再次采样噪声,得到一种卷曲感极强的有机形态:
下面拆解它。
思路:先扭曲坐标
普通噪声是对坐标 p 采样:fbm(p)。
域扭曲多了一步:先用两次独立的 fbm 计算出一个偏移向量 w,再用 p + w 作为新坐标采样:
w.x 和 w.y 是两个方向的偏移量,分别用不同的偏置(3.1 和 7.7)让它们互相独立,不产生对称。最终每个像素的采样坐标被噪声本身"推开"了一段距离,产生漩涡卷曲的形态。
1.2 是什么
w * 1.2 中的 1.2 是扭曲强度。值越大,坐标被推得越远,图案卷曲越剧烈;值接近 0,结果退化成普通 fbm。
试着改一改
| 改动 | 效果 |
|---|---|
1.2 改成 3.0 | 扭曲更剧烈,出现大漩涡 |
1.2 改成 0.2 | 扭曲很轻微,接近普通 fbm |
3.1 和 7.7 改成 1.0 和 2.0 | 偏置不够独立,两个方向可能产生对称感 |
在最终 fbm 外再套一层域扭曲 | 二次扭曲,形态更复杂 |
练习
在 main 函数里,用两次 fbm 构造偏移向量 w,然后对 p + w * 1.2 做最终采样,输出域扭曲噪声。
答案解析
把 float n = fbm(p) 替换成两行:先算 w,再用扭曲后的坐标算 n。
fbm(p + 3.1)和fbm(p + 7.7):两个独立的噪声场,分别作为 X 和 Y 方向的偏移量p + w * 1.2:把坐标用噪声向量推移后再采样1.2:扭曲强度,决定推移距离
初始代码直接 fbm(p) 是普通分形噪声,没有卷曲感。加上 w 之后,坐标先被噪声场扭曲,再采样,结果出现漩涡般的有机形态。
试着把 1.2 改成 4.0,看看卷曲感急剧增强的效果。