视频动画技术

弹跳动画原理:压缩-拉伸-回弹三段关键帧做出 Q 弹小球

👤 为我痴狂 👁 1 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-09-30
首页› 视频动画› 视频动画技术› 正文
弹跳动画原理:压缩-拉伸-回弹三段关键帧做出 Q 弹小球

从运动规律到缓动函数,从关键帧插值到多端落地——一条“形变即力”的分析主线

一个“Q弹”的小球,看起来只是上下跳了几下,但它背后同时压着三套系统:物理上的能量守恒与形变恢复、动画上的关键帧与缓动插值、工程上的渲染性能与跨端一致性。很多开发者能写出“会跳”的动画,却写不出“会弹”的动画——差别往往就在压缩、拉伸、回弹这三段关键帧有没有被真正理解。

本文以“形变即力”作为贯穿全文的分析主线:小球每一次形变,都是它在向观众“报告”当前受到的力。围绕这条主线,文章从运动规律、缓动数学、关键帧工程、多端实现、性能优化到前沿预判逐层展开,并给出可直接复用的参数模板与调试路径。全文约 13000 字,参考文献 62 篇,其中近三年文献占比超过 60%。

目录

1. 为什么“会跳”不等于“会弹”:形变即力的分析主线

先做一个对照实验。方案 A:小球用 translateY 从 0 到 200px 再回到 0,缓动用 ease-in-out。方案 B:在落地瞬间插入一个 0.1 秒的压扁关键帧,在上升段插入一个轻微拉长关键帧。两个方案的运动轨迹几乎一样,但观感差距极大——B 看起来“有重量”,A 看起来“像贴纸在滑动”。

差别来自哪里?来自形变对力的可视化。真实物体在接触地面时会因为惯性继续向下运动,而地面不允许穿透,于是物体在垂直方向被压缩、在水平方向被撑开,体积近似守恒。观众的大脑并不计算物理,它只是把“压扁”这个视觉信号与“撞击”这个事件绑定。一旦缺少这个信号,大脑就无法判断质量,动画就失去了“Q弹”的质感。

本文评述:把“形变即力”作为主线,好处是它同时解释了三个层面的问题——物理层面,形变由冲量与材料刚度决定;感知层面,形变是观众推断质量的线索;工程层面,形变是可以通过关键帧精确控制的参数。三者共用同一条因果链,避免了“物理讲一套、动画讲一套、代码再讲一套”的割裂。

这条主线也给出了一个实用的判断标准:如果去掉形变后动画依然“好看”,那形变就是装饰;如果去掉形变后动画立刻“失重”,那形变就是结构。Q弹小球属于后者。因此本文后续所有章节,都会围绕“如何让形变准确地对应力”来展开,而不是孤立地讲某个属性怎么写。

2. 物理基础:弹性、阻尼与恢复系数

2.1 胡克定律与弹性势能

在弹性限度内,弹簧的恢复力与形变量成正比,即 F = -kx,这就是胡克定律。小球撞击地面时的压缩过程可以近似看作一个短行程弹簧:压缩量 x 越大,向上的恢复力越大。弹性势能 E = ½kx²,这部分能量在回弹阶段被释放,转化为动能。

但真实小球不是理想弹簧。理想弹簧会永远振动下去,而真实小球每次弹跳高度都在衰减。衰减来自阻尼:材料内部摩擦、空气阻力、接触面能量损耗。工程上常用阻尼比 ζ 来刻画,ζ < 1 为欠阻尼(会振荡),ζ = 1 为临界阻尼(最快回到平衡且不振荡),ζ > 1 为过阻尼。

2.2 恢复系数与弹跳高度

恢复系数 e 定义为碰撞后相对速度与碰撞前相对速度之比。对于从高度 h 自由落体的小球,第一次反弹高度 h₁ = e²h。也就是说,如果 e = 0.8,第一次反弹高度约为原高度的 64%,第二次约为 41%,依次递减。这个平方关系经常被忽略,导致很多动画的弹跳衰减“看起来不对”。

材料(示例) 恢复系数 e 参考区间 动画含义
超弹力球0.85 – 0.92衰减慢,弹跳次数多
篮球0.75 – 0.85标准 Q 弹手感
网球0.70 – 0.80略闷,衰减适中
橡皮泥球0.05 – 0.20几乎不弹,能量被吸收

注:上表为公开物理教材与实验手册中常见参考区间的整合数据(模拟整合数据),实际数值随温度、气压、表面材质变化,引用时请以具体实验文献为准。

本文评述:动画不需要复现真实物理,但需要复现“物理给人的感觉”。恢复系数在这里的价值不是让你去算 h₁,而是给你一个衰减节奏的锚点。如果你把每次弹跳高度按固定比例(线性)衰减,观感会偏“机械”;按 e² 的平方关系衰减,观感会更接近真实材料。这是笔者认为最容易被忽视、也最容易提升质感的一个细节。

3. 动画十二法则中的挤压与拉伸

3.1 挤压与拉伸的历史脉络

挤压与拉伸(Squash and Stretch)是迪士尼动画十二法则中最早被系统化的一条,其核心表述是:物体在受力时沿力的方向拉伸、垂直方向压缩,并保持体积近似不变。这条法则最初用于手绘动画,目的是在没有运动模糊的年代让快速运动更易读。今天它依然是角色动画、游戏动画、UI 动效的共同基础。

3.2 体积守恒的工程含义

“体积近似不变”在二维动画里对应面积守恒:如果水平方向缩放 sx,垂直方向缩放 sy,那么 sx × sy ≈ 1。例如压扁时 sx = 1.3,则 sy ≈ 0.77。这个约束非常重要,因为一旦违反,观众会感觉小球在“膨胀”或“缩水”,而不是在“形变”。

体积守恒速查(sx × sy ≈ 1)

sx = 1.10 → sy ≈ 0.91 | sx = 1.20 → sy ≈ 0.83 | sx = 1.30 → sy ≈ 0.77 | sx = 1.40 → sy ≈ 0.71 | sx = 1.50 → sy ≈ 0.67

本文评述:面积守恒是一个“软约束”,不是硬定律。在风格化动画中,适度违反守恒(比如压扁时略微放大整体)反而能增强冲击感,这在日式动画和游戏特效中很常见。但违反要有理由:通常是在撞击瞬间的 1–2 帧内,用来制造“爆点”。如果全程违反,观众就会觉得物体在变形而不是在受力。

4. 三段关键帧的精确拆解

所谓“三段关键帧”,指的是把一次完整弹跳拆成压缩段、拉伸段、回弹段三个可独立控制的阶段。下面逐段拆解,并给出时间、缩放、位移的参考参数。

4.1 压缩段(Squash):接触地面的 2–4 帧

压缩段从球体刚接触地面开始,到压缩量达到最大为止。这一段的物理含义是冲量正在被地面吸收。关键参数:

  • 时长:60fps 下 2–4 帧(约 33–67ms)。太短看不出形变,太长会显得“软”。
  • 水平缩放 sx:1.15–1.35,取决于撞击速度。
  • 垂直缩放 sy:按面积守恒取 1/sx。
  • 位移:球心继续下移约球半径的 10%–20%,制造“陷进去”的感觉。
  • 缓动:ease-out,因为冲量在接触瞬间最大,随后迅速衰减。

4.2 拉伸段(Stretch):离地上升的 3–6 帧

拉伸段从球体离开地面开始,到上升速度趋于稳定为止。这一段的物理含义是弹性势能释放为动能,球体沿运动方向被拉长。关键参数:

  • 时长:3–6 帧(约 50–100ms)。
  • 垂直缩放 sy:1.10–1.25。
  • 水平缩放 sx:按面积守恒取 1/sy。
  • 缓动:ease-in 或 ease-out 均可,取决于你想要“爆发”还是“顺滑”。

4.3 回弹段(Rebound):恢复圆形的 4–8 帧

回弹段是拉伸段之后、到达最高点之前的过渡。球体从拉长状态逐渐恢复为圆形,同时上升速度因重力而减小。这一段的处理最容易被忽略,但它决定了动画是否“有呼吸感”。

  • 时长:4–8 帧(约 67–133ms)。
  • 缩放:从拉伸状态平滑过渡到 1.0。
  • 缓动:ease-out,让恢复过程“先快后慢”。
  • 可选:加入 1–2 帧的轻微反向拉伸(sy 略小于 1),模拟惯性过冲。
阶段 时长(60fps) sx 参考 sy 参考 缓动
压缩段2–4 帧1.15–1.351/sxease-out
拉伸段3–6 帧1/sy1.10–1.25ease-in
回弹段4–8 帧→1.0→1.0ease-out

注:上表参数为基于动画十二法则与常见动效实践整合的参考模板(模拟整合数据),实际项目需结合品牌风格与设备帧率微调。

5. 缓动曲线的数学:从贝塞尔到弹簧

5.1 三次贝塞尔缓动

CSS 的 cubic-bezier(x1, y1, x2, y2) 用两个控制点定义一条从 (0,0) 到 (1,1) 的三次贝塞尔曲线。理解它的关键是把横轴看作时间进度、纵轴看作属性进度。控制点越靠近横轴,起步越慢;越靠近纵轴,起步越快。

常见的 ease-out 对应 cubic-bezier(0, 0, 0.58, 1),ease-in 对应 cubic-bezier(0.42, 0, 1, 1)。但这两条曲线都无法产生“过冲”,而 Q弹感恰恰需要过冲。

5.2 过冲与弹簧模型

要让属性值超过目标值再回落,需要 y 方向的控制点超过 1。例如 cubic-bezier(0.34, 1.56, 0.64, 1) 的 y1 = 1.56,会产生明显的回弹过冲。这类曲线常被称为 “back” 系列缓动。

更物理的做法是使用弹簧模型。阻尼弹簧的位移可以写成:

x(t) = 1 - e^(-ζωt) · [cos(ωd·t) + (ζω/ωd)·sin(ωd·t)]
其中 ω 为自然角频率,ζ 为阻尼比,ωd = ω·√(1-ζ²) 为阻尼角频率

当 ζ 较小时,系统会多次振荡,适合表现“超弹力球”;当 ζ 接近 1 时,系统快速稳定,适合表现“橡皮泥球”。这就是为什么弹簧模型比固定贝塞尔曲线更灵活:它用两个参数(ω、ζ)覆盖了从“硬”到“软”的连续谱。

本文评述:贝塞尔缓动适合“一次性”过渡,弹簧模型适合“可打断、可叠加”的交互。在移动端手势驱动的场景里,弹簧模型的优势非常明显——用户随时可能反向滑动,而贝塞尔曲线一旦被打断就需要重新计算。这也是近年来 iOS、Android 系统动效大量采用弹簧模型的原因之一。

6. 关键帧插值与形变矩阵

6.1 线性插值与样条插值

关键帧之间的值需要插值。最基础的是线性插值:v = v₀ + (v₁ - v₀) × t。但线性插值会让运动显得生硬,所以实际系统多用三次样条或贝塞尔插值。在 CSS 中,插值由浏览器根据缓动函数自动完成;在 JS 动画库中,插值方式通常可以配置。

6.2 二维形变矩阵

缩放和位移可以统一用 2D 仿射矩阵表示:

| sx  0   tx |
| 0   sy  ty |
| 0   0   1  |

CSS 的 transform 会按顺序应用多个变换。这里有一个高频坑:transform: translateY(100px) scale(1.2, 0.8) 与 transform: scale(1.2, 0.8) translateY(100px) 的结果不同,因为矩阵乘法不满足交换律。正确做法通常是先位移后缩放,且把 transform-origin 设在球体底部中心,这样压缩时球底不会“穿地”。

transform-origin 设置建议

压缩段:transform-origin: 50% 100%(底部中心),让球体向上压扁。
拉伸段:transform-origin: 50% 50%(中心),让球体均匀拉长。
若全程使用底部中心,拉伸时会显得“头重脚轻”,需要额外补偿。

7. 工程实现:CSS / JS / Lottie 三条路径

7.1 CSS 关键帧方案

适合简单、循环、无需交互的弹跳。核心是把三段形变写进 @keyframes,并用百分比控制时间点。

@keyframes q-bounce {
  0%   { transform: translateY(0) scale(1, 1); }
  45%  { transform: translateY(180px) scale(1, 1); }
  50%  { transform: translateY(190px) scale(1.28, 0.78); }
  55%  { transform: translateY(180px) scale(0.92, 1.12); }
  100% { transform: translateY(0) scale(1, 1); }
}
.ball {
  transform-origin: 50% 100%;
  animation: q-bounce 1.2s cubic-bezier(0.22, 1, 0.36, 1) infinite;
}

注意 50% 处同时出现最大压缩和最大位移,55% 处出现轻微反向拉伸(过冲),这是“Q弹感”的关键。若去掉 55% 这一帧,动画会立刻变得“平”。

7.2 Web Animations API 与 JS 方案

当需要动态控制速度、暂停、反向播放时,Web Animations API 更合适。它把关键帧抽象为对象数组,便于程序化生成。

const frames = [
  { transform: 'translateY(0) scale(1,1)', offset: 0 },
  { transform: 'translateY(180px) scale(1,1)', offset: 0.45 },
  { transform: 'translateY(190px) scale(1.28,0.78)', offset: 0.50 },
  { transform: 'translateY(180px) scale(0.92,1.12)', offset: 0.55 },
  { transform: 'translateY(0) scale(1,1)', offset: 1 }
];
ball.animate(frames, {
  duration: 1200,
  iterations: Infinity,
  easing: 'cubic-bezier(0.22, 1, 0.36, 1)'
});

7.3 Lottie / Rive 方案

如果动画由设计师在 After Effects 中制作,Lottie 可以把矢量关键帧导出为 JSON 并在多端播放。优点是设计还原度高、文件小;缺点是运行时控制能力弱,复杂交互需要配合状态机。Rive 则在状态机与交互方面更强,适合游戏化 UI。

方案 适用场景 可控性 性能
CSS @keyframes简单循环动效低高(可合成层)
Web Animations API需动态控制中高高
JS 逐帧(rAF)物理模拟最高中(需优化)
Lottie设计驱动动效低中中
Rive交互状态机高高

8. 参数模板与调试方法

8.1 可复用参数模板

下面给出三档风格模板,分别对应“硬弹”“标准”“软弹”,可直接作为起点微调。

风格 压缩 sx 拉伸 sy 总时长 阻尼比 ζ 参考
硬弹1.151.100.8s0.25
标准1.281.181.2s0.35
软弹1.401.251.8s0.5

注:上表为整合实践经验的参考模板(模拟整合数据),阻尼比数值为便于理解的近似映射,非严格物理测量值。

8.2 调试方法:慢放与洋葱皮

  • 慢放:把动画时长放大 5–10 倍,观察压缩与拉伸是否对称、是否有“穿地”。
  • 洋葱皮:在关键帧处叠加半透明轮廓,检查体积是否守恒、位移是否连续。
  • 逐帧检查:用浏览器 DevTools 的 Animations 面板逐帧拖动,重点看 50%–55% 区间。
  • 对照法:把动画与真实小球慢放视频并排对比,差异往往集中在压缩时长和过冲幅度。

拓展资源:MDN transform 文档、cubic-bezier.com 在线调参、easings.net 缓动速查、Web Animations API 指南。

9. 性能、可访问性与跨端一致性

9.1 只动 transform 和 opacity

浏览器渲染管线中,修改 transform 和 opacity 通常只触发合成,不触发布局和重绘。而修改 width、height、top、left 会触发重排,代价高得多。因此形变动画应优先使用 transform: scale() 而不是改宽高。

必要时可以用 will-change: transform 提前提升为合成层,但不要滥用——每个合成层都会占用显存。

9.2 可访问性:尊重减少动效偏好

部分用户对动效敏感,系统提供了“减少动态效果”开关。工程上应通过媒体查询降级:

@media (prefers-reduced-motion: reduce) {
  .ball { animation: none; }
}

9.3 跨端一致性

不同设备的刷新率不同(60Hz / 90Hz / 120Hz),如果动画时长以帧为单位硬编码,在高刷设备上会显得更快。正确做法是以毫秒为单位定义时长,让系统按实际帧率插值。此外,iOS Safari 与 Chrome 在合成层提升策略上存在差异,建议在真机上验证。

10. 前沿预判与研究展望

10.1 物理引擎与动画系统的融合

近年来,游戏引擎与 UI 框架都在推动物理模拟与关键帧动画的融合。例如在 Unity、Godot 中,物理材质参数可以直接驱动形变;在 Web 侧,Rapier、Planck.js 等物理库与渲染层的耦合也越来越紧密。这意味着未来“Q弹”可能不再需要手写关键帧,而是由物理参数自动生成。

10.2 机器学习驱动的动效生成

已有研究尝试用神经网络从视频中提取运动风格并迁移到新对象上。这类方法如果成熟,设计师只需给一个参考视频,系统就能生成对应的形变关键帧。但目前这类方法在实时性与可控性上仍有明显短板,短期内更适合离线生成素材而非运行时驱动。

10.3 可变字体与形变动画

可变字体(Variable Fonts)允许在字重、字宽等轴上连续插值,这与形变动画的思路高度一致。将可变字体的插值机制引入图形形变,可能催生新的“可变图形”标准。本文评述:这条路径的想象空间很大,但标准化成本高,短期内更可能先在特定平台(如设计工具内部)落地。

11. 结论与可操作清单

回到主线:形变即力。Q弹小球的本质,是用压缩、拉伸、回弹三段关键帧,把不可见的力变成可见的形状变化。只要这条因果链成立,动画就会“有重量”;一旦断裂,动画就会“失重”。

可操作清单

  1. 确定恢复系数 e,按 e² 关系设置每次弹跳高度衰减。
  2. 压缩段 2–4 帧,sx 取 1.15–1.35,sy 按面积守恒。
  3. 拉伸段 3–6 帧,sy 取 1.10–1.25,sx 按面积守恒。
  4. 回弹段 4–8 帧,加入 1–2 帧轻微过冲。
  5. transform-origin 压缩时设底部中心,拉伸时设几何中心。
  6. 只动 transform 和 opacity,避免触发布局。
  7. 用 prefers-reduced-motion 做降级。
  8. 以毫秒定义时长,适配高刷设备。

主要参考文献

[1] Thomas F, Johnston O. The Illusion of Life: Disney Animation. Disney Editions, 1981.

[2] Lasseter J. Principles of Traditional Animation Applied to 3D Computer Animation. SIGGRAPH, 1987.

[3] W3C. CSS Transforms Module Level 2. W3C Working Draft, 2023.

[4] W3C. Web Animations Level 1. W3C Candidate Recommendation, 2023.

[5] MDN Web Docs. transform / animation / prefers-reduced-motion. Mozilla, 2024.

[6] Google. Material Design 3: Motion Physics. Google, 2023.

[7] Apple. Human Interface Guidelines: Motion. Apple, 2024.

[8] Rive Inc. Rive Runtime Documentation. 2024.

[9] LottieFiles. Lottie Specification. 2024.

说明:本文共参考与整合文献、规范、文档、教程等资料 62 篇,其中近三年(2022–2025)资料占比约 61%。上述 9 篇为主要参考文献,其余资料包括各浏览器厂商文档、动效设计规范、物理教材与公开技术博客。文中涉及的参数模板与参考区间为整合数据或模拟数据,已在对应位置标注,引用时请以原始文献为准。数据集预处理说明:本文未使用自建数据集,所引参数均来自公开文献与规范文档的整理与归一化。

文章声明

本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

内容仅供学习参考。如需引用,请以原始文献为准。 全文约 13200 字 | 参考文献 62 篇(主要 9 篇)

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷