本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
栗子8 —— 城市建筑风光
在本例中,我们将编写一个脚本来绘制城市建筑的轮廓。这对于制作背景或者产生设计想法非常有用。
因为大多数建筑都是矩形的,所以我们想使用一个类似于之前使用的 square 波的函数。但是这个函数太重复了,所以不能用。幸运的是,还有另外一个预定义函数非常适合这个功能: cellNoise 。以下一个图表预览。
它的行为类似于前面例子中看到的 noise 函数,但是非连续的。它的输出会产生从一个等级随机跳到下一个等级的直线。这对于许多应用程序是完美的,包括建筑轮廓!试试这个脚本:
p1 = period;
p2 = period/3;
p3 = period/7;
p4 = period/11;
offsetDist = d + seed;
w1 = w1Amp * cellNoise(offsetDist/p1);
w2 = w2Amp * cellNoise(offsetDist/p2);
w3 = w3Amp * cellNoise(offsetDist/p3);
w4 = w4Amp * cellNoise(offsetDist/p4);
offset = d < 20 ? 0 : (w1+w2+w3+w4);
ox = x + nx * offset;
oy = y + ny * offset;
设置以下参数范围: period 在 [100..300] 之间, seed 在 [0 .. 50000] 之间, w1Amp 到 w4Amp 都在 [0..100] 之间。
在产生随机模式时,一种常见的技术是将几个周期递减的噪声波合并在一起。周期最大的波设置了曲线的大致轮廓,然后通过添加高频波来添加细节。
这就是我们在这里所做的:将主要的 period 参数除以 3、7 和 11 ,生成三个较小的周期,然后在对 cellNoise 函数的连续调用中使用它们。一颗全局的种子为所有的波形所共享。每一个波都根据它自己的振幅参数进行缩放,最终的偏移量是通过将四个波相叠加产生的。你还会注意到,如果当前距离小于 20 ,我们将 offset 设置为 0。则当我们开始画的时候,这条线就不会垂直向上或向下。
现在是有趣的部分!打开脚本图形窗口,玩振幅参数,找到你喜欢的种子!
非常酷!但现在,如果我们想在不同深度绘制城市建筑景观,我们就必须每次都调整周期和振幅。为了简化操作,让我们添加一个全局 scale 参数,并将其范围设置为[0..10]。
p1 = period*scale;
p2 = p1/3;
p3 = p1/7;
p4 = p1/11;
offsetDist = d + seed;
w1 = w1Amp * cellNoise(offsetDist/p1);
w2 = w2Amp * cellNoise(offsetDist/p2); w3 = w3Amp * cellNoise(offsetDist/p3);
w4 = w4Amp * cellNoise(offsetDist/p4);
offset = d < 20 ? 0 : scale*(w1+w2+w3+w4);
ox = x + nx * offset;
oy = y + ny * offset;
我们现在可以通过减少每条线的缩放参数,快速创建有深度的城市景观场景。下面是一个使用平行线尺创建的例子,为这个脚本提供了一个完美直接的指南:
栗子9 —— 闪电
下回分解
栗子10 —— 信号错误识别
下回分解
栗子11 —— 调试
下回分解