跳转到内容

上下文

Cavalry 的架构实现了一些令人惊叹且独一无二的功能。从表面看,这意味着用更少的图层就能完成更多的工作,但其底层到底发生了什么?

需要理解的核心概念是索引(Index)。索引只是一个传递给其他图层的数字。Duplicator 的一个基本作用就是为它生成的 Shape 分配索引。这个索引可以被 Duplicator 和其他图层用来决定位置、旋转、颜色、边数……几乎任何东西。

假设用一个 Duplicator 创建了一列 10 个矩形。

在这种情况下,Duplicator 生成了 10 个索引,并根据分布(Distribution)设置为每个复制的 Shape 提供位置(本例中为GridHeight350Size ModeFit)。Index:0(第一个形状)被分配到 Position Y0Index:9(第十个/最后一个形状)被分配到 Position Y350,其他 Shape 均匀分布其间。

那么如果把这个 Duplicator 添加到第二个 Duplicator 中会发生什么?这里第二个 Duplicator 被设置为 Grid,其中 Count X = 5Count Y = 1

索引会流向第二个 Duplicator 生成的形状。当 Duplicator 被复制时,这个索引计数会持续在图中传递。

以下是一个实际示例:

  1. 创建一个 Text Shape
  2. 使用 String 属性旁边的 + 按钮添加一个 String Generator
  3. Generator 设置为 Value
  4. Text Shape 添加到一个 Duplicator
  5. Grid Distribution 上设置 CountX = 1Y = 10

结果:一列零。

表面上看,这里没有发生什么有趣的事情 😉,但那只是因为我们还没有要求 Duplicator 对索引做任何处理。所以让我们让它生成一些随机值传递给 Number 属性。

  1. 创建一个 Random Behaviour。
  2. 连接 random.id→stringGenerator.number。

结果: 每个数字都是 0 到 10 之间的随机数(默认值)。

Duplicator 将随机数传递给每个副本。

以上之所以能够实现,是因为 Duplicator 为每个数字提供了索引,而 Random Behaviour 利用了该上下文。

  • DuplicatorString Generator 请求其 Number 属性 10 次。
  • 相应地,String GeneratorRandom 请求其 Number 属性的值 10 次。
  • 在这 10 次中,Random 接收到的 Index 值依次为:0, 1, 2, 3, 4, 5, 6, 7, 8, 9。
  • 基于每个索引,Random 更改其 Seed 值以产生不同的结果。

这个思路可以应用于 Cavalry 中的任何属性。让我们用同样的方法来影响 Polygon 的边数。

  1. 创建一个 Polygon Shape。
  2. 将其添加到一个 Duplicator
  3. 添加一个 Random Behaviour。
  4. Minimum 设置为 3Maximum 设置为 5
  5. 连接 random.id→polygon.sides。

每个形状被赋予 3 到 5 之间的随机边数。

这个概念可以用于 Noise Deformer、Color、Stroke Width、Path Length、Blur Filter、Asset Array、Dynamic Rendering……任何东西。可能性是无穷的!😎

有时可能需要手动控制这些索引的分配方式。这分为两个层级。首先是阻止 Duplicator 使用”传入索引”。

以我们的矩形网格(复制的 Duplicator)为例:

  1. Attribute Editor中,取消勾选 Duplicator1 的 Advanced 标签下的 Use Index Context

现在 Duplicator1 的索引会传递给第二个 Duplicator。

要进一步推进这个想法,需要借助 Context Index Utility。