本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
栗子7 —— 抖动线条
“平滑、美丽的线条” 是 LNP(Lazy Nezumi Pro) 的标志线条之一,许多用户在寻找线条防抖器时发现了它。但如果使用得当,凌乱、抖动的线条在合适的背景下也会看起来很棒。让我们编写一个脚本,让我们的线条带有一些有品味的不完美!
我们要做的第一件事是添加一些线的粗细,让它看起来像我们在用流墨的钢笔绘图。如果您仔细查看函数引用,您将看到有一个 rand 函数,它返回一个范围为 [0..1] 的随机值。我们试着把输入压力乘以一个随机的量看看会得到什么。
op = p ? p * rand() : 0;
很有趣,但不是我们要找的。有点脏,而不是缩放我们的输入压力,让我们尝试添加一个小的随机量。我们将使用 mix 函数将随机值重新映射到 minNoise 和 maxNoise 之间。
op = p ? p + mix(minNoise, maxNoise, rand()) : 0;
这是 minNoise 在 -0.2 和 maxNoise 在 0 时的样子:
这样看起来更好,但如果我们能控制不完美的长度就更好了。 rand 函数每次都返回不同的值,所以我们必须尝试其他方法。如果你看函数参考,你会发现一个叫做 noise 的波函数。这是一个图表预览。
这是一个非重复的连续函数,这很好,因为它看起来是随机的,但我们仍然可以控制它的缩放,就像其他波函数一样。试试这个脚本:
n = 0.5 + noise(d/period) / 2;
op = p ? p + mix(minNoise, maxNoise, n) : 0;
noise 函数返回一个范围为 [-1..1] ,因此我们将它重新映射到 [0..1] ,所以我们可以使用它来混合 minNoise 和 maxNoise ,类似之前的脚本。
这是 period 为 30 , minNoise 为 -0.3 , maxNoise 为 0 时的样子:
现在我们有进展了!这个噪声看起来更加微妙,不像之前的脚本看起来像是我们用钢笔乱画一通。
能够通过 period 参数控制噪声图案的宽度确实是非常好的。
但现在如果你仔细观察底部的三条直线,你可能会注意到一些东西。即使对每条线施加的压力不同,你仍然可以看出每次的噪声图案是完全相同的。这在某些情况下是有用的,但如果我们能改变图案就更好了。通过在传递给噪声函数的距离值上添加一个固定的偏移量,我们可以很容易地做到这一点。让我们将其命名为 seed ,并将其范围设置为 [0..10000]:
n = 0.5 + noise((seed+d)/period) / 2;
op = p ? p + mix(minNoise, maxNoise, n) : 0;
现在我们可以在每次需要不同图案时更改 seed 参数。如果我们希望能够复制我们喜欢的特定图案,这是很好的,但如果我们希望每一条线都有不同的模式,而不必每次都更改参数,该怎么办呢? 在这种情况下,我们可以使用 rand 函数在行首自动初始化我们的种子
seed = seed ? seed : rand() * 10000;
n = 0.5 + noise((seed+d)/period) / 2;
op = p ? p + mix(minNoise, maxNoise, n) : 0;
由于脚本变量在开始绘制之前被初始化为零,我们可以通过只在种子值为零时才给它一个新值来重新初始化种子值。这就是第一行使用条件赋值所做的。现在每条线的噪声图案看起来都不一样了!
让我们通过向笔的位置添加抖动来完成这个脚本。我们将使用与前面示例中相同的法向量置换偏移技术。但这一次,置换偏移将被调用 noise 函数的结果所取代,乘以一个新的 posNoiseAmount 参数:
seed = seed ? seed : rand() * 10000;
n = 0.5 + noise((seed+d)/period) / 2;
op = p ? p + mix(minNoise, maxNoise, n) : 0;
pn = posNoiseAmount * noise((seed+d)/posNoisePeriod);
ox = x + nx * pn; oy = y + ny * pn;
这是 posNoisePeriod 为 30 和 posNoiseAmount 为 3 时的样子。这实际上是一个挺不错的水反射线效果!
栗子8 —— 城市风光
下回分解
栗子9 —— 闪电
下回分解
栗子10 —— 信号错误识别
下回分解
栗子11 —— 调试
下回分解