现象:为什么「震一下」比「一直晃」更有冲击力?
在动作游戏或影视级过场动画中,我们常常看到这样的设计:一次重击、一次爆炸、一次落地,屏幕在极短的时间内(通常 0.1~0.3 秒)产生剧烈的位移与旋转抖动,随后迅速恢复稳定。这种「瞬时高频、快速衰减」的震动,给玩家带来的生理冲击感远胜于持续数秒的均匀晃动。然而,很多开发者在使用 UE5 的 CameraShake 时,往往只停留在「调参」层面——把振幅调大、频率调高,结果却发现画面变得廉价、眩晕,甚至丢失了打击的「重量感」。
问题的根源在于:屏幕震动的冲击感并非来自振幅的绝对值,而是来自「能量注入」与「能量耗散」的时间结构。要真正驾驭它,我们必须回到引擎的底层实现,理解它如何用数学函数模拟物理冲击,以及这些函数在时间轴上如何被采样与混合。

原理:CameraShake 的数学本质——正弦波、噪声与包络的乘积
UE5 的 UCameraShakeBase 及其默认子类 UMatineeCameraShake(旧版)或 ULegacyCameraShake,其核心算法可以抽象为一个简单的乘积公式:
Offset(t) = Amplitude * Envelope(t) * Oscillator(t)
其中:
- Amplitude(振幅):决定了震动的最大偏移量,单位是厘米(位置)或度(旋转)。
- Envelope(t)(包络):一个随时间衰减的标量函数,通常是指数衰减
e^(-λt)或线性衰减。它决定了震动「持续多久」以及「衰减多快」。 - Oscillator(t)(振荡器):产生高频交替变化的核心,通常由多个不同频率、不同相位的正弦波叠加而成,或者使用 Perlin 噪声来模拟不规则抖动。
这个公式看似简单,却揭示了冲击感的三个关键维度:强度(Amplitude)、持续时间(Envelope)、频率成分(Oscillator)。三者相互制约,任何一项的失衡都会导致「假」或「晕」。
为什么是乘积而不是加法?
加法意味着震动会有一个「基线偏移」,而乘积保证了当包络衰减到 0 时,震动完全停止,不会残留静态偏移。这是物理合理性的要求——冲击结束后,镜头必须回到原状。此外,乘积形式允许我们独立控制「衰减速度」和「振荡模式」,这在调参时提供了极大的灵活性。
振荡器的秘密:单一正弦波为什么不够?
如果 Oscillator(t) 只是一个单一频率的正弦波,震动会听起来像「嗡嗡」的电子音,视觉上也会显得机械、单调。真实世界的冲击(如爆炸、撞击)包含丰富的频率成分。因此,UE5 的 CameraShake 允许你定义多个 FOscillator,每个都有自己的频率、振幅和波形类型(正弦、方波、锯齿等)。这些振荡器叠加后,产生复杂的、非周期性的抖动,更接近物理真实。
💡 技巧:在 UE5 中,默认的
PerlinNoiseCameraShakePattern使用 Perlin 噪声作为振荡器,它比多个正弦波叠加更自然,尤其适合模拟手持摄像机或持续的环境震动。但对于瞬时冲击,WaveOscillatorCameraShakePattern配合指数衰减包络往往能提供更「脆」的打击感。
推导:从冲击物理到镜头语言——如何设计一条「有重量」的震动曲线
假设我们模拟一次重锤砸地的冲击。物理上,地面受到一个瞬时冲量,产生一个尖峰加速度,随后由于土壤阻尼,振动迅速衰减。这个过程可以用一个阻尼正弦波来描述:
x(t) = A * e^(-ζω₀t) * sin(ω₀√(ζ²) * t + φ)
其中 ζ 是阻尼比,ω₀ 是自然频率。在 UE5 的 CameraShake 中,我们无法直接设置 ζ 和 ω₀,但可以通过 Duration(持续时间) 和 Oscillation Duration(振荡持续时间) 以及 Blend In/Out Time(混合时间) 来间接控制。
关键推导:冲击感 = 高频能量在极短时间内释放,且衰减时间常数远小于振荡周期。这意味着包络的衰减必须比振荡的周期更快。例如,如果振荡频率是 30Hz(周期 33ms),那么包络的衰减时间常数应小于 50ms,这样在 2~3 个周期后震动就基本消失,形成「短促有力」的感觉。
反之,如果衰减太慢,震动会持续几十个周期,变成「摇晃」,失去冲击力。这就是为什么很多开发者把 Duration 设成 1 秒以上时,画面会变得像果冻。

参数映射表:从物理量到 UE5 参数
| 物理概念 | UE5 参数 | 影响 | 推荐值(冲击类) |
|---|---|---|---|
| 冲量强度 | Amplitude(位置/旋转) | 偏移幅度 | 位置 5~15cm,旋转 2~5° |
| 阻尼比 | Duration / Blend Out Time | 衰减速度 | Duration 0.2~0.4s,Blend Out 0.1s |
| 自然频率 | Oscillator Frequency | 抖动快慢 | 20~40Hz(位置),10~20Hz(旋转) |
| 频率成分 | Oscillator Count / 波形 | 抖动复杂度 | 2~3 个振荡器,混合正弦与噪声 |
注意:上表是针对「重击」类冲击的推荐值。对于爆炸,频率可以更低(10~20Hz),持续时间稍长(0.5~0.8s),以体现冲击波的扩散感。对于枪械后坐力,频率更高(40~60Hz),持续时间极短(0.1s)。
验证:用曲线可视化理解包络与振荡的交互
在 UE5 编辑器中,打开 CameraShake 蓝图,你可以看到 WaveOscillator 的预览曲线。但更直观的方法是:在 MatineeCameraShake 的 Timeline 中,观察 Amplitude 和 Frequency 的曲线。你会发现,当 Amplitude 曲线从 1 瞬间降到 0,而 Frequency 保持恒定,最终输出的位移曲线就是一个快速衰减的正弦波。如果 Amplitude 曲线是线性下降,那么衰减过程会显得「拖泥带水」;如果是指数下降,则「干净利落」。
我们可以用 Python 快速验证不同包络下的视觉感受(伪代码):
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 0.5, 1000)
freq = 30
# 指数衰减包络
exp_env = np.exp(-t * 20)
# 线性衰减包络
lin_env = np.clip(1 - t * 4, 0, 1)
# 振荡
osc = np.sin(2 * np.pi * freq * t)
plt.plot(t, exp_env * osc, label='Exponential')
plt.plot(t, lin_env * osc, label='Linear')
plt.legend()
plt.show()
运行后你会看到:指数衰减的波形在 0.1 秒内就几乎归零,而线性衰减的波形在 0.25 秒后还有明显振幅。前者看起来像「被击打」,后者像「被推动」。
总结:冲击感设计的三个黄金法则
基于以上原理推导,我们可以提炼出 UE5 屏幕震动冲击感设计的三个核心法则:
- 法则一:短促优先。 冲击类震动的持续时间不应超过 0.5 秒,理想区间是 0.15~0.3 秒。超过 0.5 秒的震动应归类为「环境震动」或「持续摇晃」,需采用完全不同的参数策略。
- 法则二:高频主导,低频辅助。 主振荡器频率应设置在 20~40Hz,以产生「脆」的质感。可叠加一个 5~10Hz 的低频振荡器来增加「重量感」,但低频振幅不应超过总振幅的 30%,否则会显得松散。
- 法则三:包络必须指数衰减。 线性衰减在视觉上会残留「尾巴」,破坏冲击的瞬时性。在 UE5 中,通过
Blend Out Time和Duration的配合,可以模拟指数衰减。更精确的做法是使用Curve资产自定义包络曲线,直接绘制指数形状。
最后,不要忽视 CameraShake 的叠加与优先级。UE5 允许同时播放多个 CameraShake,它们会按权重混合。如果一次爆炸同时触发了「低频冲击」和「高频碎裂」两个震动,混合后的效果可能比单一震动更丰富。但要注意总振幅的累加,避免超过 20cm 导致画面撕裂。

在实际项目中,我见过太多团队把 CameraShake 当作「调味料」,随意撒一点就完事。但真正的 3A 级打击感,是精确到帧的数学设计。希望这篇剖析能让你下次调参时,不再凭感觉,而是凭公式。
关于火星人教育
火星人教育创办24年来,始终专注于数字艺术与 AIGC 实战职业技能培训。我们深知,技术深度决定职业高度——就像屏幕震动背后的数学原理,只有吃透底层逻辑,才能在项目中做出真正有冲击力的作品。火星人教育开设的 UE5 游戏特效、AIGC 视觉设计、AI 漫剧创作、MAYA 三维动画、C4D 动态设计、NUKE 影视后期、室内全屋定制、工业设计、摄影摄像实训 等课程,均以项目化实训教学为核心,帮助美术生、在校大学生及意向转行的职场人群夯实专业技能,助力就业与职业提升。北京、深圳双校区开设线下面授班,欢迎咨询:010-65918670。








评论(0)