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)与类型 | 说明 |
|---|---|---|
| Input | List<float>(Required) | 待挑选的浮点列表,即数据来源 |
| Index | Int32(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
| 名称 | 类型 | 说明 |
|---|---|---|
| Selected | System.Single | 从列表中选出的浮点值 |
输出是单个System.Single(即 C# 的float)。在源码中它被声明为Slot<float>输出槽,通过挂接Selected.UpdateAction += Update在每帧求值时执行挑选逻辑。当Index或Input内容发生变化时,该输出会在当前求值帧内同步更新,可直接连接到其他运算符的浮点参数输入。
核心行为:索引越界、负索引与空列表的底层实现
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]; }这段实现揭示了三个重要的运行时约定:
空列表/未连接时不崩溃:当
Input为null或列表元素数为 0 时,运算符直接输出default(即0f)并返回,保证求值链路稳定,不会抛出索引越界异常。这在节点图运行时上游列表可能为空(例如数据录制尚未开始)的场景中非常关键。索引自动循环(wrap-around):索引不是简单地
list[index],而是先经过Mod(list.Count)处理。这意味着即使Index超过了列表长度,也不会越界崩溃,而是自动回到列表开头循环。例如列表长度为 2、Index = 3时,实际取到的是list[1]。负索引自动修正:
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),仅供参考