Blender动画节点插件用户指南-循环

Blender动画节点插件用户指南-循环
推荐:将 NSDT场景编辑器 加入你的3D开发工具链

循环

循环子程序允许在动画节点中进行迭代。迭代是 多次执行一组节点的行为,每次都是 通常称为迭代。迭代次数(简称迭代)是循环将执行的次数。每次迭代 有一个与之关联的整数,称为索引,此索引为 0 表示 第一次迭代,1 表示第二次,2 用于第三次迭代,依此类推 最后一次迭代,其索引为 n-1,其中 n 是 迭 代。

image

参数和迭代器

循环可以具有参数,这些值被馈送到循环并且 所有迭代的常量,除非明确更改。价值观 从一个迭代到另一个迭代的更改由所谓的迭代器定义。迭代器是一个列表,它将循环的第 n 个元素提供给 第 n 次迭代,因此在第一次迭代中,迭代器将 循环其第一个元素,在第二次迭代时,迭代器馈送 循环其第二个元素,依此类推。如果不存在迭代器,则 可以使用迭代输入手动设置迭代次数 如果迭代器是 目前,迭代次数是自动设置的,并且将相等 到迭代器的长度,即 迭 代。可以使用多个迭代器,在这种情况下,数量 迭代次数等于最小迭代器的长度。 迭代器和参数可以通过加号按钮添加 新迭代器新参数 分别。

循环通常用于自动执行任务或重复任务,例如, 如果要使 10 个对象平滑着色,可以添加 10 个阴影对象 平滑节点并为每个节点指定一个对象,但那会很乏味 而且效率低下,如果有 100 个对象怎么办?会添加 100 个节点吗? 使用循环将是一种更明智的方法,只需创建一个列表 包含这些对象并将该列表用作循环中的迭代器 包含单个“着色对象平滑”节点,其输入对象为 迭代器的输出。在第一次迭代时,输出 迭代器将是第一个对象,因此第一个对象被着色 平滑,在第二次迭代时,迭代器的输出将是 第二个对象,因此第二个对象变得平滑着色,依此类推。 通常,当人们想要描述这样的循环时,人们会说“我们循环 物体并使它们变得光滑“,术语循环在某物上意味着 使用该东西作为迭代器。

生成器

生成器是一个列表,最初是空的,并允许人们 在每次迭代时向其添加/追加值。一个发电机有两个 输入、要附加的值和条件(默认隐藏) 这是一个布尔值,如果希望附加值,则为 True。 否则为假。例如,如果一个人有一个整数列表和 一个人只想保留偶数,一个人会循环 整数,检查它们是否是偶数,如果是,则附加它们,这是 通过使用检查的输出作为条件来完成。新发电机 可以使用加号按钮“新建生成器输出”进行添加。名称 生成器的类型可以从其高级节点设置中设置。

图像

高级节点设置

  • 描述 - 循环函数的描述。这 描述仅在以下情况下出现在“调用子程序”节点中 但是,选择所需的子程序是一种很好的做法 为每个子程序编写描述,以便其他用户 了解其功能。
图像

迭代器套接字

新建迭代器按钮可用于添加新迭代器,这是 等效于节点中的按钮。如果存在迭代器,则 选项使用 {迭代器} 作为输出将显示每个选项,如果 为迭代器启用,迭代器将作为输出提供 调用循环时。输出将与您输入的列表相同。 这对于通过使用输出避免不必要的数据复制很有用 而不是从源迭代器创建另一个分支,这将 强制数据复制。此外,这也确保了循环的执行 首先是串联的结果。请参阅以下示例。

参数套接字

“新建参数”按钮可用于添加新参数,这是 等效于节点中的按钮。显示参数列表 与他们的选择。对于每个参数,以下选项是 目前:

  • 输入 - 如果启用,参数将可用/公开为 调用循环时的输入,如果禁用,则不会 可用作输入,其值将等于其默认值 价值。循环的某些应用程序使用参数作为临时参数 占位符或作为输出,因此有时,它们被期望 具有一定的初始值,以确保用户不会 更改其预期值,可以使用此值隐藏参数 选择。在这种情况下,该参数称为虚拟参数。看 以下示例。
  • 输出 - 如果启用,该参数将用作 调用循环时的输出,如果禁用,它将不可用 作为输出。此选项的重要性将在以下情况下显而易见 我们讨论重新分配运算符。请参阅以下示例。
  • 复制 - 如果启用,则每次迭代的参数将为 其源的不同副本,如果禁用,动画节点将 自动处理复制,因此即使禁用它, 如果动画节点决定复制参数,则无论如何都可以复制参数。 此选项仅适用于可复制的结构,因此 它不适用于简单的数据类型,如整数和 浮。此选项在某些高级情况下很有用,请参阅 以下示例。
  • 默认值 - 参数的默认值,此选项为 仅适用于简单数据类型,因此 BVH 和 KD 等数据类型 树木没有此选项。
  • 隐藏 - 启用后,默认情况下,当 用户添加调用子程序节点。

重新分配运算符

参数对于所有迭代都是恒定的,但是,可以更改 它们在某个迭代中的值,使用所谓的重新分配 运算符,可以使用“重新分配”按钮添加此运算符。这 运算符有两个输入,参数的新值和一个条件, 如果此条件为 True,则运算符将参数值更改为 新值,如果条件为 False,则呈现运算符 无效,参数保留其值。请参阅以下示例。

图像

列表生成器

将显示生成器列表。箭头可用于更改 生成器作为输出的顺序。应该注意的是,迭代器 - 如果 用作输出 - 将始终根据其输入首先显示 次序。此外,参数(如果用作输出)将显示在 根据其输入顺序结束。

中断条件

中断条件强制循环在某个迭代时终止。 中断条件具有单个布尔输入“继续”(如果为 True,循环正常继续,如果为 False,则循环为 终止,当前迭代之后的所有迭代都不会执行。一个 可以通过“新建中断条件”按钮添加中断条件 高级节点设置。请参阅以下示例。

图像

执行机制

循环具有一定的执行机制,可以用 定义的有序步骤数,第 n 个执行机制 迭代如下:

  1. 循环输入节点返回当前迭代的索引, 迭代次数、参数(如果可用)和 迭代器的输出(如果可用)。参数的值 如果它们未作为输入公开,则等于其默认值。 迭代器的输出是它们的第 n 个元素。如果迭代器 没有第 n 个元素,循环终止。此外,如果索引 当前迭代等于迭代次数,即 循环终止。
  2. 循环的主体,即所有节点(不包括生成器)、 重新分配运算符和中断条件 — 基于 循环输入节点提供的值。

对于每个中断条件:

  • 如果其继续输入为 ,则循环终止。False

对于每个生成器:

  • 如果其条件输入为 ,则值将追加到 它指向的列表。True

对于每个重新分配运算符:

  • 如果其条件输入为 ,则 它指向的参数将更改为输入值。True

中断条件生成器重新分配运算符之前执行的事实至关重要,因为如果循环在 某些迭代,该值将附加在该处 生成器的迭代将不会附加,并且参数 将在该迭代中重新分配,将不会重新分配。但是,请注意,循环的主体在中断之前执行 条件,随后,身体在该时执行的任何动作 将进行迭代。例如,如果使用循环来定位 某些对象(使用“对象转换输出”节点)并返回其 位置 - 使用生成器 - 如果该循环在第五次迭代时中断, 第五个对象将被定位,但是,它的位置不会 附加。

例子

例 1

在此示例中,整数生成器用于追加 每次迭代。迭代次数是使用迭代输入手动定义的,因为不存在迭代器。

图像

请注意,第一次迭代的索引为 0,最后一次迭代的索引为 0 迭代具有索引 n-1,其中 n 是迭代次数。

例 2

在此示例中,浮点生成器用于追加索引 除以 n-1,其中 n 是迭代次数。

图像

请注意,由于最大/最后一个索引等于 n-1,因此 输出将是一个从零开始到结束的算术序列 与 1.

例 3

在此示例中,生成器用于在每个值处追加多个值 迭 代。这些值由填充有索引的列表定义。

图像

例 4

在此示例中,如果索引为偶数,则使用生成器追加索引 数。这是通过使用生成器的条件来完成的。

图像

请注意,如果某个整数的模二是偶数,则为零。 因此,仅当数字为偶数时,条件才为 True。

例 5

在这个例子中,我们遍历一个整数列表,并使用一个生成器来 仅附加偶数整数,如上述示例所示。

图像

请注意,由于存在迭代器,因此迭代次数为 现在由列表的长度定义,没有迭代输入。

例 6

在这个例子中,我们遍历两个整数列表,并使用生成器来 追加两个整数的乘积。

image

请注意,第二个列表有 5 个元素,而第一个列表只有 4 个元素, 因此,循环忽略第二个列表的第五个元素,并且仅 执行 4 次。随后,输出列表仅包含 4 元素。

例 7

在这个例子中,我们遍历一个整数列表,并使用一个生成器来 追加整数乘以某个参数。

image

请注意,参数的值对于所有迭代都是常量。

例 8

在这个说明性示例中,我们有两个节点树,据说它们 做同样的事情,即隐藏搅拌机组中的对象,然后 然后显示/取消隐藏它们。唯一的区别是,在节点树上 是的,我们使用迭代器作为输出,并将该输出用作 第二个循环的迭代器,而在左侧节点树上,我们使用 对象列表直接作为两个循环的迭代器。

image

这两个节点树其实不一样,左边的节点树 不应使用有两个原因:

  1. 循环的执行顺序没有定义。应该动画 节点先执行上循环还是下循环?没有办法 知道,所以动画节点以任意顺序执行它们。这 导致意外结果,因为如果执行了 show 循环 首先,对象最终将被隐藏,因为隐藏循环将 执行第二个。
  2. 即使未编辑对象列表,动画节点也会复制它 以为你想要两个不同的副本。

正确的节点树通过以下方式解决了这两个问题:

  1. 通过执行第二个来定义循环的执行顺序 取决于第一个的输出,从而指示动画节点 以首先执行依赖项。
  2. 对象列表不会复制,因为它是按顺序使用的,即 是,不发生分支。

总之,应始终使用正确的设置。

例 9

在这个说明性示例中,我们使用生成器来附加 整数参数。

image

由于参数对于所有迭代都是常量,因此 生成器将是一个填充了参数值的列表。 但是,可以在某个参数处更改参数的值 由重新赋值运算符进行迭代。在以下示例中,我们 将参数的值重新分配/更改为某个新值 第四次迭代,即当索引等于 3 时:

image

请注意,在第四次迭代时追加的值是旧值, 重新分配参数时,其值会因所有迭代而更改 在当前迭代之后,而当前迭代仍然具有旧的 价值。

例 10

在此示例中,我们在整数列表中找到最大的整数。这 通过添加一个整数参数来完成,其值是第一个整数, 然后我们循环遍历整数,如果整数在当前迭代 大于参数,然后我们重新分配 参数为当前迭代末尾的整数 循环,参数的值将是 列表。然后我们通过在其高级中启用输出来输出该参数 节点设置。

image

因为每当整数大于存储的整数时,我们都会重新分配 在参数中,我们最终得到最大的整数,为什么?带上你的 是时候考虑一下了。

例 11

在这个例子中,我们找到某个第一次出现的索引 整数列表中的整数。我们首先添加一个虚拟整数参数 其初始/默认值等于负一,然后我们循环 整数,将参数重新分配给迭代的索引, 我们还检查当前整数是否是我们的目标整数 寻找,如果是,我们打破循环。最后,我们输出假人 参数。在循环结束时,参数将具有所需的 索引减去 1,因此通过添加 1,我们得到我们正在寻找的索引。

image

在中断发生时,当前迭代索引为 我们正在寻找的索引,但突破发生在 重新分配(或节点中的任何其他操作),因此当前索引 永远不会写入参数,但我们知道索引是 要写的,其实是前一个索引加一,就是 为什么我们在最后添加一个。

请注意,我们本可以采用另一种方法,方法是将 最初为零的虚拟参数如下,但会更少 由于额外的加指令而高效:

image

例 12

在此示例中,我们计算每个顶点的相邻顶点数 网格中的顶点。我们首先初始化一个用零填充的整数列表 其中其长度是顶点数,这是通过使用数据结构的方法完成的。我们 然后循环遍历网格的边缘索引列表,零列表为 一个参数。对于当前边缘指数中的每个指数(有两个), 我们在索引处获取零列表的元素并将其值设置为 其值加 1 使用“设置列表元素”节点,有效地 将其值递增 1。最后,我们重新分配 零列表到“设置列表元素”节点的输出,并将其输出为 一个参数。fromValue(value, length)LongList

image

这里发生了什么?顶点的相邻顶点数为 连接到它的边数,因此要计算相邻边的数量 顶点,只需计算连接到该顶点的边数 顶点。为此,我们可以计算顶点的次数 在边缘索引列表中提到,我的意思是 倍,其索引出现在边缘索引列表中。所以我们循环 边,并增加每个顶点被提及的次数 一、每个顶点在开始时被提及的次数为零 的循环,因此是零列表。花点时间考虑一下。

但是,如果我们只对一个顶点感兴趣呢?在这种情况下,我们可以 在边缘上循环,如果我们感兴趣的顶点的索引是 等于边缘中两个索引中的任何一个,我们应该递增一个 最初将参数零 1 并输出该参数。当循环时 完成,参数将表示顶点的次数 出现在边缘列表中。

image

我们增加上述数量的方式是不寻常的,我们添加了一个布尔值 到整数!这称为隐式转换,布尔值是 转换为 如果是 和 如果是 ,所以通过添加 直接条件,如果索引是 已找到,如果未找到索引,则为零(即不递增)。

3D建模学习工作室翻译整理,转载请标明出处!

上一篇:Blender动画节点插件用户指南-分组 (mvrlink.com)

下一篇:Blender动画节点插件用户指南-脚本 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号