你說:
你能给我讲讲ae中的wiggle表达式吗
当然可以!wiggle
是 After Effects 中最常用的表达式之一,它可以让属性(如位置、缩放、旋转等)在一个随机范围内动态波动,非常适合用于模拟自然的、不规则的运动。
javascriptwiggle(frequency, amplitude)
frequency
:每秒波动的次数,决定了运动的速度。amplitude
:波动的幅度,决定了运动的范围。让图层的位置在 5 次/秒的频率下,随机波动 50 像素:
javascriptwiggle(5, 50)
让旋转角度波动: 在“旋转”属性上添加:
javascriptwiggle(2, 15)
如果你只希望在 X 或 Y 轴上波动,可以通过数组限定:
javascriptx = wiggle(5, 50)[0]; // 获取 X 轴的值
y = value[1]; // Y 轴保持原值
[x, y]
[0]
和 [1]
分别代表 X 和 Y 轴。例如,让一个属性波动但叠加一个基础值:
javascriptwiggle(3, 20) + 100
100
。如果想动态控制频率和幅度,可以用滑块控制器:
javascriptfreq = effect("滑块控制器1")("滑块");
amp = effect("滑块控制器2")("滑块");
wiggle(freq, amp)
模拟摄像机抖动: 在“位置”属性上使用:
javascriptwiggle(2, 10)
灯光闪烁效果: 在“光强度”属性上使用:
javascriptwiggle(10, 50)
自然摆动的树枝或旗帜: 在“旋转”属性上使用:
javascriptwiggle(1, 5)
在某些情况下,你可以给 wiggle
添加更多参数,例如限制它的随机种子(seed)或应用时间范围:
javascriptwiggle(frequency, amplitude, octaves, amp_mult, t)
octaves
:控制细节层次,数值越高,运动越复杂。amp_mult
:控制每层细节的振幅递减。t
:以不同时间点计算波动。例如:
javascriptwiggle(5, 30, 2, 0.5, time)
如果有具体场景需要实现的效果,随时告诉我,我可以帮你定制表达式!
其实 wiggle(5, 30, 2, 0.5, time)
并不会在 6 秒后停止波动,它会一直产生随机运动,除非明确对 time
参数做额外限制。这里的 time
参数只是定义了时间点,而不是限制波动的持续时间。
让我们分解一下它的作用:
wiggle
参数含义回顾javascriptwiggle(frequency, amplitude, octaves, amp_mult, t)
frequency (5)
:每秒波动 5 次。amplitude (30)
:波动范围为 ±30。octaves (2)
:波动细节的层数,越高运动越复杂。amp_mult (0.5)
:振幅的逐层衰减倍率。t (time)
:指定波动计算所基于的时间点。在你的例子中:
time
传入的是当前时间(即 合成时间线的位置),所以 wiggle
会根据当前时间动态更新值,而不会停止。wiggle
在指定时间后停止?如果你想让波动在某个时间点后停止,可以使用条件语句:
javascriptt = time; // 当前时间
if (t < 6) {
wiggle(5, 30, 2, 0.5, t)
} else {
value; // 恢复到原始值
}
time < 6
秒时,应用 wiggle
。如果你希望波动在接近 6 秒时逐渐减弱,而不是突然停止,可以使用 linear()
函数来过渡:
javascriptfade = linear(time, 5, 6, 1, 0); // 在 5 到 6 秒之间从 1 过渡到 0
wiggle(5, 30 * fade)
如果你只想让 wiggle
生效于特定时间范围(如从 2 秒到 6 秒):
javascriptif (time > 2 && time < 6) {
wiggle(5, 30)
} else {
value; // 超出时间范围时保持原始值
}
wiggle
会一直作用,直到时间线结束。linear()
),可以灵活控制波动的时间范围或停止方式。
如果你有具体的场景需要实现,我可以进一步帮你调整代码!你的思路接近,但实际的 wiggle
参数工作方式稍有不同!让我们仔细分析 振幅逐层衰减倍率(amp_mult
) 对 wiggle
的影响,以及为什么 wiggle(5, 30, 2, 0.5, time)
不会在 60 秒后停止波动。
amp_mult
的作用amp_mult
决定了振幅随着 octaves(层数) 增加而衰减的倍率,公式如下:
振幅的计算方式:
textamplitude * (amp_mult ^ n)
其中:
amplitude
是初始振幅(这里是 30
)。amp_mult
是每层振幅的衰减倍率(这里是 0.5
)。n
是层数,从第 1 层(n=0
)到第 octaves
层(这里是 2
层)。对于你的表达式 wiggle(5, 30, 2, 0.5, time)
:
n=0
):text30 * (0.5 ^ 0) = 30
n=1
):text30 * (0.5 ^ 1) = 15
这里的 60
秒 和振幅衰减没有直接关系,因为 amp_mult
和 时间 无关。wiggle
是实时计算的,只要时间线还在走,wiggle
就会一直波动。
amp_mult
不会让振幅归零:
振幅的衰减只取决于层数(octaves
),并不随时间推移进一步递减。即使 amp_mult=0.5
,第 2 层的振幅是 15,超出指定层数后就不再计算。
时间对振幅没影响:wiggle
中的 t
参数是用来指定时间点的(比如 time
或自定义值),它不会影响振幅的计算方式。
wiggle(5, 30, 2, 0.5, time)
:
octaves
和 amp_mult
决定,总是 初始值 + 次层叠加值。有更多疑问可以继续问,我会详细解答! 😊
振幅的层数(octaves
)与 time
或 每秒一层 完全无关,它是一个固定的参数,用来决定波动的细节复杂程度。它的核心作用是为振幅的随机波动引入更多细节,类似添加“子波动”。
octaves
的含义octaves
是一个层数的概念:
它决定了波动的“层次感”或“复杂程度”,每一层都会在上一层的基础上增加更小、更细微的变化。
与时间无关:
这些层数并不会随时间动态增加或减少,而是由 octaves
参数直接固定。例如:
octaves=1
:只有一个简单的波动层,运动显得很平滑。octaves=2
:在第 1 层波动的基础上再叠加一个更小幅度、更高频率的层,使波动更加复杂。每层的振幅是上一层振幅的倍数衰减,公式如下:
振幅 = amplitude * (amp_mult ^ n)
n
表示当前层的索引,从 0 到 octaves - 1
。假设:
amplitude
):30amp_mult
):0.5octaves
):3每层振幅如下:
n=0
):30 × (0.5^0) = 30n=1
):30 × (0.5^1) = 15n=2
):30 × (0.5^2) = 7.5总振幅叠加结果:30 + 15 + 7.5 = 52.5
(随机运动的最大范围是 ±52.5)
wiggle
中的 time
参数仅用于指定波动的时间点,和层数没有关系。例如:
当 t = time
(默认):
表示根据合成当前时间动态生成波动值。
当 t
为固定值(如 10
):
表示以时间线的第 10 秒为基准生成波动,值保持不变。
所以,时间只是控制波动的采样点,而不会影响 octaves
的层数。
octaves
的层数是固定的,与时间或每秒增加一层无关。octaves
的主要作用是增加波动细节,振幅逐层递减,直到达到指定的层数。linear()
或条件语句动态控制。如果还有疑问或需要更详细的例子,可以随时告诉我! 😊
当然!wiggle
表达式中的最后一个参数 t
(通常是 time
)确实有点让人困惑,但它实际上控制了 波动值的计算时间点。默认情况下,t
是合成的当前时间(time
),但你可以通过传入自定义值改变它的行为。
t
参数的作用t
指定了生成随机波动值时的“时间点”,即计算波动的基准时间。
t
是 time
(默认值),波动会随着合成时间动态变化,表现为实时运动。t
是一个固定值(例如 5
),波动会基于第 5 秒的状态进行计算,结果不会随时间改变。t
是一个函数或表达式(例如 time * 0.5
),波动会基于该时间表达式进行动态调整。t = time
这是 wiggle
的默认行为:
javascriptwiggle(5, 30)
含义:
wiggle
每秒波动 5 次,幅度 ±30。t
隐式取值为当前的 time
,所以波动值会随着时间线实时更新。t = 5
将 t
设置为一个固定值:
javascriptwiggle(5, 30, 2, 0.5, 5)
效果:
应用场景:
t = time * 0.5
可以让 t
和时间线的变化保持特定比例:
javascriptwiggle(5, 30, 2, 0.5, time * 0.5)
效果:
t
的增长速度减慢了。t
的实际用途控制波动时间同步
如果多个图层使用相同的 wiggle
表达式,但希望它们在不同的时间点开始波动,可以修改 t
:
javascriptwiggle(5, 30, 2, 0.5, time + index)
index
)调整波动的起点,创造出错开的波动效果。冻结波动状态
如果你需要在特定时间点冻结波动值,可以固定 t
:
javascriptwiggle(5, 30, 2, 0.5, 10)
平滑过渡
可以使用渐变时间控制 t
的值:
javascriptwiggle(5, 30, 2, 0.5, linear(time, 0, 10, 0, 5))
t
在 0 到 10 秒之间从 0 平滑过渡到 5,创建出一种“逐渐引入波动”的效果。t = time
:实时动态波动。t = constant
:生成静态随机值。如果你有具体的使用场景需要实现,可以告诉我,我可以帮你设计更具体的表达式! 😊