这篇文章介绍了在After Effects中制作动态波浪效果的多种方法。首先使用形状图层与钢笔工具绘制直线,再通过“摆动路径”调整大小、频率、平滑度等参数生成基础波动;若需固定两端,可结合液化效果收束。为了获得更高自由度,可以借助Tilda脚本,通过控制波长、波高、速度、裁剪和收缩等选项生成灵活曲线;如果脚本不足,则可利用表达式手写路径点与贝塞尔切线,实现随机且平滑的动态曲线。最后,还可叠加湍流置换与液化,营造更自然流动的水波效果。
如何制作动态的波浪效果呢。
创建图层
首先用右键单击图层区域创建一个形状图层。

然后我们需要用钢笔工具画一条直线。方法就是先选择钢笔工具,然后在起点点击一下,然后再在终点点击一下。


我们可以点击上方的颜色调整,注意我们调整边框而不是填充色。

添加摆动
我们给形状添加“摆动路径”

然后摆动就添加好了,我们可以看到很多参数我们都可以调节。点我们可以调整为“平滑”

所有属性的介绍如下:
1. 大小 (Size)
控制路径偏移的幅度,也就是每个点能在原始位置周围摆动的最大距离。数值越大,形状轮廓的抖动越明显。
2. 详细信息 (Detail)
决定路径抖动的复杂程度。低数值时抖动比较大块、平滑;高数值时就会出现更精细的“锯齿感”,类似增加了噪声的频率。
3. 点 (Points)
设定路径上是由“角点”还是“平滑点”来组成:
- **角点 (Corner)**:产生尖锐的折角,抖动后更像碎裂的边缘。
- **平滑点 (Smooth)**:产生圆润的曲线,形状的变动更柔和。
4. 摆动/秒 (Wiggles/Second)
就是频率,每秒路径抖动多少次。数值越高,动画越快。
5. 关联 (Correlation)
决定路径上各点之间的相关性:
- 高相关(接近 100%):点们一起动,路径变形比较整体化。
- 低相关(接近 0%):点们各自乱动,效果更混乱。
6. 时间相位 (Temporal Phase)
控制时间维度上的偏移,可以理解为“在时间轴上把噪声整体往前/往后推”。改变这个值会让动画从不同的时间点开始。
7. 空间相位 (Spatial Phase)
控制空间上的偏移,把路径抖动的噪声图案在空间上进行偏移。多个图层使用同样参数但不同空间相位时,可以得到类似“同频不同步”的效果。
8. 随机植入 (Random Seed)
控制噪声的随机性。改变这个值不会影响频率或幅度,但会得到完全不同的抖动方式,相当于“重新抽一张随机数”。
两侧收束
如果你想要两侧收束的效果,而不是起点和终点不停变化,可以尝试使用液化效果,将两侧向中心点挤一下就好了。
给所有的曲线合并到一个预合成,然后再合成上添加


更高自由度的曲线
如果你需要精细曲线或者更加高自由度的曲线,可以使用Tilda脚本来实现。
下载好Tilda之后,复制jsxbin文件到AE脚本目录
Win:...Adobe After Effects CC\Support Files\Scripts\ScriptUI Panels\
Mac:应用程序\Adobe After Effects CC\Scripts\ScriptUI Panels\
打开AE软件设置,勾选上*允许脚本读写和访问网络

窗口菜单中我们就能看到他了。

选择需要添加波纹的图层,点击Wave即可。

Direction → 方向
Wave Length → 波长
Wave Height → 波高
Wave Roundness → 波形圆度
Speed → 速度
Phase → 相位
Trim → 修剪/裁剪
- Show Trimmed → 显示裁剪部分
- Start → 起点
- End → 终点
- Offset → 偏移
- Trim By Points → 按点裁剪
Choke → 收缩
- On Start → 起点收缩
- On End → 终点收缩
- On Sharp Points → 锐角点收缩
- On All Points → 所有点收缩
Settings → 设置
Ease → 缓动
Random → 随机
- Seed → 随机种子
- Random Length → 随机长度
- Random Height → 随机高度
- Random Roundness → 随机圆度
像是前面提到的固定开头和结尾在脚本也是有选项的。

纯表达式控制
如果这个脚本还无法完成,就可以自己纯手搓一个表达式来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| // =================== // 参数配置 // =================== startPt = [0, 300]; // 贝塞尔曲线起点(x, y) endPt = [800, 300]; // 贝塞尔曲线终点(x, y) numPtsBase = 10; // 基础中间点数量(控制曲线细分程度) detailLevel = 1.2; // 细分等级(越大曲线越平滑,最终点数=base*level) ampMax = 50; // y方向最大摆动幅度(像素) freq = 0.5; // y方向摆动频率(每秒摆动次数) seedRandom(3, true); // 设置随机种子(保证每次运行结果一致,可选)
// =================== // 生成对称随机浮动点 // =================== newPts = []; // 存储最终点的数组 for (i = 0; i <= numPtsBase * detailLevel; i++) { t = i / (numPtsBase * detailLevel); // 当前点在曲线上的归一化位置(0~1)
// ===== x方向:对称随机偏移(核心修改) ===== // 方法1:使用Math.random()生成[-1,1]区间随机数,缩放至[-3,3] xRandom = (Math.random() * 2 - 1) * 3; // 方法2:直接使用random(-3,3)(若环境支持此函数) // xRandom = random(-3, 3); x = startPt[0] + t * (endPt[0] - startPt[0]) + xRandom;
// ===== y方向:周期性波动+对称随机波动 ===== localAmp = ampMax * Math.sin(Math.PI * t); // 周期性波动幅度(随t增大而减小) timePhase = Math.random() * Math.PI * 2; // 时间相位(每个点不同,避免同步波动) spacePhase = Math.random() * Math.PI * 2; // 空间相位(每个点不同,增加随机性) yWave = Math.sin(time * freq * 2 * Math.PI + spacePhase + t * Math.PI) * localAmp; yRandom = Math.random() * 10 - 5; // 静态随机偏移(-5~5像素) y = startPt[1] + yWave + yRandom;
// 将生成的点存入数组 newPts.push([x, y]); }
// =================== // 自动生成平滑贝塞尔切线 // =================== inTans = []; // 存储每个点的入切线 outTans = []; // 存储每个点的出切线 for (i = 0; i <= newPts.length - 1; i++) { if (i == 0 || i == newPts.length - 1) { // 首尾点:固定切线(无波动) inTans.push([0, 0]); outTans.push([0, 0]); } else { // 中间点:用相邻点计算平滑切线 prev = newPts[i - 1]; // 前一个点 next = newPts[i + 1]; // 后一个点 // 切线方向为前后点差值的1/3(控制曲线平滑度) tangent = [(next[0] - prev[0]) / 3, (next[1] - prev[1]) / 3]; inTans.push([-tangent[0], -tangent[1]]); // 入切线(反向) outTans.push([tangent[0], tangent[1]]); // 出切线(正向) } }
// =================== // 输出最终路径 // =================== createPath(newPts, inTans, outTans, false); // 调用路径创建函数(假设已定义)
|
湍流效果
如果还是不满意,其实用湍流+液化也可以实现。这样不只是上下的震动摆动,还可以实现流动效果。

我们可以给偏移和演化K帧来实现。
