ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TiXL AnimVec2 算子完全指南:用双通道 BPM 同步 LFO 驱动 2D 动画向量

TiXL AnimVec2 算子完全指南:用双通道 BPM 同步 LFO 驱动 2D 动画向量 TiXL AnimVec2 算子完全指南用双通道 BPM 同步 LFO 驱动 2D 动画向量【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3AnimVec2 是 TiXL 开源实时动态图形软件中位于Lib.numbers.anim.animators家族的动画算子它生成与当前 BPM 速率同步的重复 LFO 类信号并同时输出两个相互独立的波形通道Vector2非常适合驱动二维位置、缩放、UV 偏移等需要两路同源但可独立调节的动画参数。本文将以仓库内该算子的官方文档为骨架结合其 C# 实现、默认配置、图形化交互 UI 与配套的 SetSpeedFactors 机制完整讲解 AnimVec2 的输入参数、输出语义、底层数学原理与现场 VJ 使用技巧。AnimVec2 是什么双通道 BPM 同步 LFO官方文档对 AnimVec2 的定义是Generates a repetitive LFO-like signal synced to the current BPM rate. It supports various shapes, modes, and forms.生成与当前 BPM 速率同步的重复 LFO 类信号支持多种形状、模式与形式。从实现看它本质上是把单个 LFO即同家族的 AnimValue扩展为两个分量源码 AnimVec2.cs 中两个通道共用一套输入参数速率、相位、振幅、偏移但各自拥有独立的 Vector2 分量值最终合并输出为System.Numerics.Vector2。因此你可以在一个算子节点内同时获得X 轴快、Y 轴慢或X 正弦、Y 锯齿这样的混合动画而不需要并联两个 AnimValue。输出ResultVector2AnimVec2 只有一个输出名称类型ResultSystem.Numerics.Vector2该输出在源码中标记为DirtyFlagTrigger.Animated见 AnimVec2.cs意味着 TiXL 的求值系统会将其视为动画信号只要时间在推进输出就会被标记为需要重算从而持续刷新下游节点。这一点与静态参数如固定颜色、常量形成关键区别——接入 AnimVec2 的下游算子每帧都会收到新值。核心数学原理信号如何被计算AnimVec2 的每一帧更新逻辑集中在Update方法中AnimVec2.cs理解它等于理解了整个算子的行为_normalizedTimeX (time phases.X) * masterRate * rateFactorFromContext * rates.X _normalizedTimeY (time phases.Y) * masterRate * rateFactorFromContext * rates.Y其中time优先取OverrideTime的连接值未连接时使用context.LocalFxTime本地效果时间masterRate来自RateFactorrateFactorFromContext来自 AnimMath.GetSpeedOverrideFromContext由AllowSpeedFactor决定rates.X/Y来自Rates输入的对应分量。随后两个通道分别计算最终值Result.X CalcValueForNormalizedTime(shape, _normalizedTimeX, 0, bias, ratio) * amplitudes.X offsets.X Result.Y CalcValueForNormalizedTime(shape, _normalizedTimeY, 1, bias, ratio) * amplitudes.Y offsets.Y即每个通道都是波形采样值 × 振幅 偏移的线性组合而波形采样值由 AnimMath.CalcValueForNormalizedTime 根据形状、归一化时间、通道索引、Bias 与 Ratio 计算得出。值得注意的是源码中的注释// Dont use vector to keep double precisionAnimVec2.cs归一化时间特意用double而非 Vector2 存储以避免长时间运行后大数值累加导致的精度损失——这是长时间演出场景下的一个实用细节。波形形状Shape与底层实现Shape输入映射到AnimMath.Shapes枚举AnimMath.cs共 13 种每种在_mapShapes映射表AnimMath.cs中有对应的数学实现枚举值名称行为说明依据_mapShapes与CalcValueForNormalizedTime0Endless输出 整数部分 小数部分的 SchlickBias可产生不断增长的阶梯延续值1Ramps线性斜坡0→1 重复2Saws反向锯齿1→0 重复3KickSaws快速回落并停留在 0类似电子乐踢鼓包络4Square方波f0.5 时为 1否则为 05ZigZag三角波0→1→0 往返6Wave正弦波归一化到 0..17Sin正弦波范围 -1..18PerlinNoisePerlin 噪声映射到 0..19PerlinNoiseSigned有符号 Perlin 噪声范围 -1..110Random基于 XxHash 的伪随机 0..1每周期跳跃11RandomSigned伪随机 -1..112Steps返回时间整数部分产生台阶式递进对于 Ramps/Saws/Wave/Square/ZigZag/KickSaws先计算Fmod(time,1)/ratio并 clamp 到 0..1 作为周期内位置再经 SchlickBias 整形Sin 与 PerlinNoiseSigned 则使用双向版本的SchlickBiasWithNegative先归一化到 0..1、加偏置、再映射回 -1..1见 AnimMath.csRandom/RandomSigned 用MathUtils.XxHash按时间与通道索引28657 * componentIndex生成确定性伪随机数保证两通道的随机序列互不相同。输入参数详解官方文档给出的输入参数表如下下面结合源码、默认配置文件 AnimVec2.t3 与 UI 配置文件 AnimVec2.t3ui 逐一展开名称Relevancy Type描述OverrideTimeSingle—ShapeInt32—RatesVector2—RateFactorSingle—PhasesVector2—AmplitudesVector2—AmplitudeFactorSingle—OffsetsVector2—BiasSingle—RatioSingle—AllowSpeedFactorInt32—OverrideTimeSingle默认 0覆盖内部标准时间。源码逻辑为OverrideTime.HasInputConnections ? OverrideTime.GetValue(context) : context.LocalFxTime——只要该输入有连接就用外部时间源替换本地效果时间。典型用法是接入 time 类算子或录音回放等自定义时间流让动画脱离从开始播放计时的默认行为。UI 配置中它的显示格式为{0:G3} if connected即仅在连接时显示数值。ShapeInt32默认 1 Ramps选择波形形状对应上文AnimMath.Shapes枚举的 13 种。源码中会先Clamp(0, Enum.GetNames(typeof(AnimMath.Shapes)).Length)防止越界AnimVec2.cs。在编辑器中该输入映射为枚举下拉框MappedType typeof(AnimMath.Shapes)。RatesVector2默认 (1, 1)每个通道的速率倍率直接乘入各自的归一化时间。UI 配置AnimVec2.t3ui中Min: 0、Max: 16表示常规 UI 滑块范围为 0..16但作为输入槽它仍可被连接任意数值。X/Y 分量独立是实现两轴不同速度的关键参数。RateFactorSingle默认 1作用于两个通道的全局主速率因子等价于对Rates两分量同时缩放。UI 显示格式为{0:G3} ×乘号后缀范围 0..16。它与Rates的区别在于RateFactor 是一把总闸适合整体提速/减速Rates 是每轴独立微调。PhasesVector2默认 (0, 0)每个通道的线性时间相位偏移单位为秒。公式中体现为(time phases.X/Y)即直接叠加在时间轴上用于错开两通道的波形起点例如让 Y 轴落后 X 轴四分之一拍。AmplitudesVector2默认 (1, 1)每个通道的波形振幅。最终值 波形采样 × 振幅 偏移。默认 (1,1) 意味着波形原样输出对 0..1 类形状或双向输出对 Sin 等 -1..1 类形状。AmplitudeFactorSingle默认 1全局振幅倍率。源码中先执行var amplitudes Amplitudes.GetValue(context) * amplitudeFactor;AnimVec2.cs即它在采样前就把Amplitudes整体缩放。UI 显示格式同样为{0:G3} ×。用于在不逐个改动 X/Y 振幅的情况下快速控制整体强度或通过调制该输入实现呼吸感的强弱变化。OffsetsVector2默认 (0, 0)每个通道的最终值偏移叠加在波形 × 振幅之后用于把信号抬到目标中心点例如把 -1..1 的正弦整体上移 0.5。BiasSingle默认 0.5Schlick 偏置系数重新分布波形在周期内的陡峭程度。底层使用 Schlick 公式SchlickBias(x, bias) x / ((1/bias - 2) * (1 - x) 1)当bias 0.5时函数恒等于x无影响趋向 0 时波形前段被压平、末端突变趋向 1 时前段陡升、末端平缓AnimMath.cs。UI 范围被 clamp 到 0..1图形拖拽时进一步 clamp 到 0.01..0.99。RatioSingle默认 1控制周期内波形占用的比例。源码计算为(Fmod(time, 1) / ratio).Clamp(0, 1)——ratio 越小波形在周期内越快走完、其余时间停留在末端对 Square 相当于占空比调节。UI 配置Min: 0、Max: 1、Clamp并显示为百分比格式{0:P2}AnimVec2.t3ui。AllowSpeedFactorInt32默认 1 FactorA开关是否从求值上下文读取外部速率覆盖。映射到AnimMath.SpeedFactors枚举None0、FactorA1、FactorB2。GetSpeedOverrideFromContext会在允许时从context.FloatVariables中查找键SpeedFactorA或SpeedFactorB找到则作为rateFactorFromContext乘入归一化时间找不到则回退为 1AnimMath.cs。这是 AnimVec2 与 SetSpeedFactors 协同工作的接口。在图中直接操控CTRL 左键拖拽官方文档特别说明You can manipulate the rate and shape directly in the graph by dragging with CTRL left mouse button.这一交互由编辑器自定义 UI AnimVec2Ui.cs 实现节点上绘制迷你波形预览标题为Anim2 当前Shape名并附带 RateFactor 数值标签波形以 80 个采样点GraphListSteps 80绘制同时用两条竖线标出 X/Y 两通道当前的归一化位置基于_normalizedTimeX/Y的 Fmod让你直观看到两轴目前走到波形的哪一段按住 CTRL 并左键拖动波形区域即可实时编辑水平拖动改变RatioRatio dragDelta.X / 100clamp 到 0.001..1垂直拖动改变BiasBias - dragDelta.Y / 100clamp 到 0.01..0.99拖拽起点以鼠标按下瞬间的参数值为基准AnimVec2Ui.cs按住 CTRL 悬停时曲线高亮、光标变为ResizeAll提示此处可拖。这意味着不需要展开参数面板直接在图上就能完成最常见的 Bias/Ratio 调节配合节点标题中的速率标签演出中可快速扫一眼确认当前速度状态。配合 SetSpeedFactors 实现现场速率覆盖文档给出的第二条实用建议是You can use [SetSpeedFactors] to override the incoming rate, which is very useful for live VJ setups.用 SetSpeedFactors 覆盖传入速率对现场 VJ 特别有用。仓库中的 SetSpeedFactors.cs 提供SpeedFactorA、SpeedFactorB两个浮点输入与ApplyAs模式切换NormalizedRates/Factor。从其内部结构SetSpeedFactors.t3看它通过两个SetFloatVar子节点把值写入上下文的FloatVariables变量名恰为SpeedFactorA与SpeedFactorB——这与AnimMath.GetSpeedOverrideFromContext中查找的键完全一致AnimMath.cs。因此典型联动方式是把 SetSpeedFactors 放在动画链上游它输出 Command 用于包裹下游算子再把 AnimVec2 的AllowSpeedFactor设为FactorA或FactorB之后你在 SetSpeedFactors 上调速所有接入的动画算子会同步变速。结合 BeatSynchronizer / BPM 系统可以做出整场动画随某个控制器或节拍统一变速的演出效果。家族对比与延伸学习AnimVec2 属于 Lib.numbers.anim.animators 算子组官方文档建议一并查看的算子及仓库对应文档/实现包括AnimValue单通道版本参数为标量Rate、Amplitude、Offset 等适合驱动单个数值AnimVec3三通道版本输出 Vector3适合驱动三维空间位置或 RGB 颜色TriggerAnim布尔触发式动画文档中给出示例链路[HasValueIIncreased]→[TriggerAnim]→[SampleGradient]→[Blob]适合被事件触发的一次性动画OscillateVec2 与 OscillateVec3由 2/3 个正弦波组合成向量的轻量辅助算子。官方文档还推荐了 HowToAnimate 示例工程仓库中位于Operators/examples/Symbols/howto/其中包含多种动画算子的实际接线示范是学习 AnimVec2 应用场景的最快途径。此外仓库还自带同类算子如 OscillateVec2、SetSpeedFactors 等的.t3/.t3ui符号定义可直接在 TiXL 编辑器中打开查看其内部连线。典型接线示例基于以上原理一个把 AnimVec2 用于二维位置动画的典型链路可以这样组织[SetSpeedFactors] →(包裹)→ [AnimVec2] → [Vector2 → 位置/平移算子] → 图形对象Shape选Sin、Rates设为 (0.5, 1.0)即可得到X 轴缓慢往返、Y 轴正常正弦的椭圆轨迹Phases设为 (0, 0.25)让 Y 通道滞后 X 通道四分之一周期产生圆形或旋转式轨迹AmplitudeFactor与Bias可分别交给现场控制器调制实现整体尺度与波形形态的实时变化需要两轴异步随机跳变时将Shape切到Random配合AllowSpeedFactor接入全局变速。默认值速查AnimVec2 在仓库中的默认配置AnimVec2.t3汇总如下可作为快速上手基线参数默认值UI 范围/格式AnimVec2.t3uiShape1Ramps枚举下拉Rates(1, 1)0..16RateFactor10..16{0:G3} ×Phases(0, 0)—Amplitudes(1, 1)—AmplitudeFactor1{0:G3} ×Offsets(0, 0)—Bias0.5clamp 0..1拖拽 0.01..0.99Ratio1clamp 0..1{0:P2}OverrideTime0仅连接时显示AllowSpeedFactor1FactorANone / FactorA / FactorB总结AnimVec2 是 TiXL 动画算子家族中一节点两路 LFO的实用成员它把 BPM 同步、13 种波形形状、Schlick Bias/Ratio 整形、双通道独立速率/相位/振幅/偏移全部收敛进一个 Vector2 输出配合编辑器内置的波形预览与 CTRL 拖拽交互让二维动画的调制变得直观且适合现场操作而其与 SetSpeedFactors 通过FloatVariables上下文协作的机制则是构建整场统一步速的 VJ 表演系统的关键接口。理解本文的公式、参数与联动方式后你可以直接打开 HowToAnimate 示例动手验证再按需替换 Shape、Rates 与 Bias/Ratio即可快速得到可演出的 2D 动态图形。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表