TiXL 运算符详解:PickFloatFromList——从浮点列表中按索引挑选数值
2026/9/21 1:29:42 网站建设 项目流程

TiXL 运算符详解:PickFloatFromList——从浮点列表中按索引挑选数值

【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3

导读

PickFloatFromList是 TiXL(开源实时动态图形软件)标准运算符库Lib.numbers.floats.logic中的一个基础选择型运算符,用于从一个已连接的浮点列表(List<float>)中按索引提取出单个浮点值。它在动画参数切换、随机调度、枚举轮播等需要"从一组预置数值中动态取一个"的场景中非常实用。读完本篇,你将掌握该运算符的输入/输出契约、索引越界与负索引的处理规则,以及如何在节点图中连接数据驱动其行为。

功能概述:列表到单值的"提取器"

PickFloatFromList的核心职责一句话即可概括:从连接的浮点列表中挑选一个浮点值并输出。它的官方描述记录在运算符库文档 .help/docs/operators/lib/numbers/floats/logic/PickFloatFromList.md 中,与同目录下的 PickFloatList(从多个列表输入中选出一个列表)形成互补:前者把"列表"压成"单值",后者把"多个输入"选成"一个列表"。

该运算符属于Lib.numbers.floats.logic命名空间(逻辑类运算),其 C# 实现位于 Operators/Lib/Symbols/numbers/floats/logic/PickFloatFromList.cs,在节点图中的一个典型形态是:上游某个运算符产出一个浮点列表 → 接入Input→ 用时间、音频或随机信号驱动Index→ 输出Selected浮点值,直接驱动参数或继续参与表达式运算。

输入参数详解

根据运算符文档,该运算符共有两个输入参数:

名称关联性(Relevancy)与类型说明
InputList<float>(Required)待挑选的浮点列表,即数据来源
IndexInt32(Relevant)要选出的元素索引,从 0 开始

两个输入的"关联性"标记来自其图形 UI 定义 Operators/Lib/Symbols/numbers/floats/logic/PickFloatFromList.t3ui:Input标记为Required(必连),Index标记为Relevant(相关)。这意味着在编辑器的参数面板中,Index通常会被优先显示,而Input属于必须接线的数据入口。

Input:浮点列表数据源

Input的类型是List<float>,在源码中以InputSlot<List<float>>声明,并带有一个预分配的默认列表容量(new List<float>(20))。这一点可以从运算符的图形化定义文件 Operators/Lib/Symbols/numbers/floats/logic/PickFloatFromList.t3 中得到印证——该文件给Input设置了默认值[5.0, 17.0],也就是说,即使尚未连接任何上游,运算符也自带一个两个元素的示例列表,方便初学者立刻看到挑选效果。

在编辑器中编辑这个列表时,使用的是 TiXL 通用的列表编辑控件(见 Editor/Gui/InputUi/ListInputs/FloatListInputUi.cs 及其基类 Editor/Gui/InputUi/ListInputs/ListInputValueUi.cs),支持:

  • 直接修改每个元素的值(浮点使用单值编辑控件SingleValueEdit);
  • 拖动行首序号按钮对元素重新排序;
  • 通过行尾的×删除元素、+在当前行后插入元素;
  • 列表为空时显示+按钮新建元素,列表未创建时显示Create按钮初始化。

Index:挑选索引

Index的类型是Int32,默认值为0(同样见.t3文件中的"DefaultValue": 0)。它决定从Input中取第几个元素,从 0 开始计数。索引可以由任意整数信号驱动——例如用Time相关表达式、帧计数器、音频分析结果或随机数运算节点提供,从而实现"按需切换"的动态挑选。

输出:Selected

名称类型说明
SelectedSystem.Single从列表中选出的浮点值

输出是单个System.Single(即 C# 的float)。在源码中它被声明为Slot<float>输出槽,通过挂接Selected.UpdateAction += Update在每帧求值时执行挑选逻辑。当IndexInput内容发生变化时,该输出会在当前求值帧内同步更新,可直接连接到其他运算符的浮点参数输入。

核心行为:索引越界、负索引与空列表的底层实现

PickFloatFromList的求值逻辑非常精简,完整实现如下(见 Operators/Lib/Symbols/numbers/floats/logic/PickFloatFromList.cs):

private void Update(EvaluationContext context) { var list = Input.GetValue(context); if (list == null || list.Count == 0) { Selected.Value = default; // float 默认值 0f return; } var index = Index.GetValue(context).Mod(list.Count); Selected.Value = list[index]; }

这段实现揭示了三个重要的运行时约定:

  1. 空列表/未连接时不崩溃:当Inputnull或列表元素数为 0 时,运算符直接输出default(即0f)并返回,保证求值链路稳定,不会抛出索引越界异常。这在节点图运行时上游列表可能为空(例如数据录制尚未开始)的场景中非常关键。

  2. 索引自动循环(wrap-around):索引不是简单地list[index],而是先经过Mod(list.Count)处理。这意味着即使Index超过了列表长度,也不会越界崩溃,而是自动回到列表开头循环。例如列表长度为 2、Index = 3时,实际取到的是list[1]

  3. 负索引自动修正Mod扩展方法对负数也做了归一化处理,其实现位于 Core/Utils/MathUtils.cs:

public static int Mod(this int val, int repeat) { // Prevent exception if (repeat == 0) return 0; var x = val % repeat; if (x < 0) x = repeat + x; return x; }

可以看到,当取模结果为负时,会加上repeat修正为合法区间[0, repeat)。这一实现同时防御了repeat == 0的除零风险。因此,用负索引(例如递减的计数器)驱动PickFloatFromList同样安全且行为可预期——Index = -1会选中列表最后一个元素。这种"取模循环"行为与同库中 PickFloat(多输入中选一个)和 PickFloatList(多列表输入中选一个)保持一致,三者都使用相同的Mod约定,体现了 TiXL 运算库在边界处理上的一致性设计。

实战用法:在节点图中驱动动态选择

PickFloatFromList最常见的接线方式是把Index交给随时间变化或随事件变化的信号驱动,从而让Selected输出在不同的预置值之间跳转。下面给出几个可直接落地的典型模式:

模式一:时间驱动的循环切换

  • 用帧计数或Time表达式生成递增的整数;
  • 接入Index
  • 由于取模循环的存在,列表会从头到尾循环往复,适合做循环动画的相位切换。

模式二:随机挑选

  • 用随机数运算符(TiXL 的Random工具类位于 Core/Utils/Random.cs)生成整数索引;
  • 每次触发即可从列表中随机抽出一个浮点值,用于随机初始化位置、大小或颜色参数。

模式三:预置参数轮播

  • 把一组"风格参数"(如偏移量、速度、缩放系数)预先填入Input列表;
  • 通过快捷键、MIDI 或音频节拍驱动Index,实现预设间的即时切换,而无需在节点图中反复改值。

与相关运算符的对比

Lib.numbers.floats.logic目录下共注册了两个"挑选"类运算符(见 README),加上单值选择运算符,三者适用场景不同,容易混淆,这里一并厘清:

运算符输入形态输出形态典型场景
PickFloatFromList一个浮点列表+ 索引单个浮点从列表内选值
PickFloatList多个浮点列表输入(MultiInputSlot)+ 索引一个浮点列表在多个列表间切换
PickFloat多个浮点输入(MultiInputSlot)+ 索引单个浮点在多个单值间切换

其中PickFloatList的实现见 Operators/Lib/Symbols/numbers/floats/logic/PickFloatList.cs,它通过Input.GetCollectedTypedInputs()收集所有已连接的列表输入,再用同样的Mod索引逻辑选出其中一个;PickFloat则是对多个float输入执行相同的"索引取模选择"逻辑。三者共享"索引取模"这一核心约定,可以看作同一选择语义在不同数据维度(值 / 列表)上的三种具体化。

参考与延伸阅读

  • 运算符官方文档:.help/docs/operators/lib/numbers/floats/logic/PickFloatFromList.md
  • 运算库索引:.help/docs/operators/lib/numbers/floats/logic/README.md
  • 运算符实现:Operators/Lib/Symbols/numbers/floats/logic/PickFloatFromList.cs
  • 图形化默认值与 InputUi 定义:PickFloatFromList.t3、PickFloatFromList.t3ui
  • 取模工具方法:Core/Utils/MathUtils.cs
  • 列表编辑器 UI:Editor/Gui/InputUi/ListInputs/ListInputValueUi.cs

小结

PickFloatFromList虽然是一个体量很小的运算符,但它是 TiXL 数据流中"列表 → 标量"转换的标准枢纽:Required级别的列表输入、Relevant级别的索引输入、以及Selected单值输出构成了清晰的三段式契约;而空列表回退为0、索引取模循环、负索引自动修正这三条边界规则,保证了它在动态信号驱动下始终稳定可靠。理解了它,也就理解了 TiXL 运算库中所有Pick*系列运算符的通用设计范式。

【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询