上下文
Cavalry 的架构实现了一些令人惊叹且独一无二的功能。从表面看,这意味着用更少的图层就能完成更多的工作,但其底层到底发生了什么?
需要理解的核心概念是索引(Index)。索引只是一个传递给其他图层的数字。Duplicator 的一个基本作用就是为它生成的 Shape 分配索引。这个索引可以被 Duplicator 和其他图层用来决定位置、旋转、颜色、边数……几乎任何东西。
假设用一个 Duplicator 创建了一列 10 个矩形。

在这种情况下,Duplicator 生成了 10 个索引,并根据分布(Distribution)设置为每个复制的 Shape 提供位置(本例中为Grid,Height 为 350,Size Mode 为 Fit)。Index:0(第一个形状)被分配到 Position Y 为 0,Index:9(第十个/最后一个形状)被分配到 Position Y 为 350,其他 Shape 均匀分布其间。
那么如果把这个 Duplicator 添加到第二个 Duplicator 中会发生什么?这里第二个 Duplicator 被设置为 Grid,其中 Count X = 5,Count Y = 1。

索引会流向第二个 Duplicator 生成的形状。当 Duplicator 被复制时,这个索引计数会持续在图中传递。
以下是一个实际示例:
- 创建一个 Text Shape。
- 使用 String 属性旁边的
+按钮添加一个 String Generator。 - 将 Generator 设置为 Value。
- 将 Text Shape 添加到一个 Duplicator。
- 在 Grid Distribution 上设置 Count 为 X = 1、Y = 10。
结果:一列零。

表面上看,这里没有发生什么有趣的事情 😉,但那只是因为我们还没有要求 Duplicator 对索引做任何处理。所以让我们让它生成一些随机值传递给 Number 属性。
结果: 每个数字都是 0 到 10 之间的随机数(默认值)。

Duplicator 将随机数传递给每个副本。
以上之所以能够实现,是因为 Duplicator 为每个数字提供了索引,而 Random Behaviour 利用了该上下文。
- Duplicator 向 String Generator 请求其 Number 属性 10 次。
- 相应地,String Generator 向 Random 请求其 Number 属性的值 10 次。
- 在这 10 次中,Random 接收到的 Index 值依次为:0, 1, 2, 3, 4, 5, 6, 7, 8, 9。
- 基于每个索引,Random 更改其 Seed 值以产生不同的结果。
这个思路可以应用于 Cavalry 中的任何属性。让我们用同样的方法来影响 Polygon 的边数。
- 创建一个 Polygon Shape。
- 将其添加到一个 Duplicator。
- 添加一个 Random Behaviour。
- 将 Minimum 设置为 3,Maximum 设置为 5。
- 连接 random.id→polygon.sides。

每个形状被赋予 3 到 5 之间的随机边数。
这个概念可以用于 Noise Deformer、Color、Stroke Width、Path Length、Blur Filter、Asset Array、Dynamic Rendering……任何东西。可能性是无穷的!😎
切换为手动模式
标题为“切换为手动模式”的章节有时可能需要手动控制这些索引的分配方式。这分为两个层级。首先是阻止 Duplicator 使用”传入索引”。
以我们的矩形网格(复制的 Duplicator)为例:
- 在Attribute Editor中,取消勾选 Duplicator1 的 Advanced 标签下的 Use Index Context。

现在 Duplicator1 的索引会传递给第二个 Duplicator。
要进一步推进这个想法,需要借助 Context Index Utility。