数值 · 07
振荡信号
Oscillator · oscillator用绝对时间生成周期位移,频率、振幅与相位各管一件事。
呼吸、漂浮和细小摆动不需要每帧累加状态。把当前时间送进正弦函数,任何刷新率在同一时刻都得到同一位置。为每个元素加相位差,比复制多个独立计时器更容易保持一组动作的关系。
公式
y(t) = offset + A·sin(2π·(f·t + phase)) period = 1/f
参数
| 本页默认 | 成熟实现 | |
|---|---|---|
| frequency f | 0.7 Hz | —每秒的完整周期数。 |
| amplitude A | 0.35 | —中心到峰值的距离。 |
| phase | per-element offset | —相位差能把同频元素排成波。 |
怎样做好
- 用时间求位置,不用
phase += 常量按帧推进;否则刷新率会改掉频率。www-motion/rewrite/aurora/model.js:5 - 相位控制编队。
rotunda把卡片索引变成相位,让细小浮动不齐步。www-motion/rewrite/rotunda/model.js:5–6 - 让振幅只负责位移范围;想改变节奏就调频率,不要靠增大振幅冒充更快。
在我们的案例里
33 个案例用振荡信号。rotunda 的卡片把索引带入相位来避免齐步,aurora 的丝带把同一个绝对时间换算为多组不同速度的着色器相位。
出现在 33 个案例
参考实现 · basics.js
/** A periodic signal of absolute time (seconds). Frame-rate independent by construction. */
export const oscillate = (time, { frequency = 1, phase = 0, amplitude = 1, offset = 0 } = {}) =>
offset + amplitude * Math.sin(2 * Math.PI * (frequency * time + phase));