讲故事的手艺人 讲故事的手艺人
  • 创作向
    • 写作
      • 非虚构
      • 剧本
      • 小说
      • 文言
      • 读书
      • 随笔
    • 拍摄
      • 纪录片
      • 设计
      • 视频
      • 摄影
  • 策划向
    • 策划资料
    • 创意之道
    • 短视频研究
  • 技术向
    • AI
    • 前期拍摄
    • 后期制作
    • 原创教程
    • 影像实验
    • 影像设备
    • 穿越机
  • 艺术向
    • 研究学习
    • 大师镜头
    • 电影赏析
    • 视频论文
    • 经验总结
  • 注册
  • 登录
首页 › 技术向 › 原创教程 › AE的弹性动画表达式Overshoot@BounceBack

AE的弹性动画表达式Overshoot@BounceBack

向安宇
2018-02-01 9:31:43原创教程阅读 2,109

AE的弹性动画表达式Overshoot@BounceBack-讲故事的手艺人

这两个弹性动画的表达式几乎万能,估计所有用AE表达式的人都知道吧。我最先是在一个老外的教程里看到,原本出处在这里:http://www.motionscript.com/articles/bounce-and-overshoot.html

先来看效果:
AE的弹性动画表达式Overshoot@BounceBack-讲故事的手艺人

Overshoot:


freq = 3;
decay = 5;
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0){
t = time - key(n).time;
amp = velocityAtTime(key(n).time - .001);
w = freq*Math.PI*2;
value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);
}else
value

其曲线效果是这样的:
AE的弹性动画表达式Overshoot@BounceBack-讲故事的手艺人

上述表达式来自于motionscript.com,还有另外一个稍有区别的版本:

Overshoot:


amp = .1;
freq = 2.0;
decay = 2.0;
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time){n--;}
}
if (n == 0){ t = 0;}
else{t = time - key(n).time;}
if (n > 0){
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}
else{value}

我按照网上的一篇分析,注释了一下:
amp = .1;
//振幅
freq = 2.0;
//频率
decay = 2.0;
//衰减,或者叫阻力、波长
n = 0;
//N其实是用来记录关键帧序号的,这个变量很重要
if (numKeys > 0){
//判断关键帧个数是否大于0,如果是执行{}中内容
n = nearestKey(time).index;
//取靠近时间线的那个关键帧的序号,这里要注意取得的关键帧有可能是时间线前的最后一个,也可能是时间线后的第一个,所以才有下一句的IF判断
if (key(n).time > time){n--;}
//如果取得的关键帧是时间线后面第一个,则N的序号减1,这样就保证里N永远代表的是时间线前的最后一个关键帧
}
if (n == 0){ t = 0;}
//如果没有关键帧(N=0)时,T=0。T是一个频率改变因数,也是一个阻力改变的因数
else{t = time - key(n).time;}
//如果N不为0,那么T就等于时间线与其之前最后一个关键帧的时间的差,也就是说时间线离这个关键帧越远T就越大
if (n > 0){//当有关键帧,也就是说有动画的时候执行{}里的内容
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
//velocityAtTime()这个函数是求在某一时刻对象的速度,AE里面叫关键帧数率,单位是“像素/秒”
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
//V是对象关键帧的瞬时速度,这个变量是作为一个振幅变量的补充,这样更符合物理现象,当速度越大振幅就越大。当对象的速度是0时,那弹性表达式结果也为0。T在Math.sin()中是作为频率的补充,作用是时间线离关键帧越远,值越大频率越快,这样比较符合物理规律。T在Math.exp()中试阻力指数,作用是时间线离关键帧越远,值越大阻力越大,最后让弹动归于平静
}
else{value}
//如果没有关键帧,原来值保持不变

Bounce:


e = .7;
g = 5000;
nMax = 9;
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0){
t = time - key(n).time;
v = -velocityAtTime(key(n).time - .001)*e;
vl = length(v);
if (value instanceof Array){
vu = (vl > 0) ? normalize(v) : [0,0,0];
}else{
vu = (v < 0) ? -1 : 1;
}
tCur = 0;
segDur = 2*vl/g;
tNext = segDur;
nb = 1; // number of bounces
while (tNext < t && nb <= nMax){
vl *= e;
segDur *= e;
tCur = tNext;
tNext += segDur;
nb++
}
if(nb <= nMax){
delta = t - tCur;
value + vu*delta*(vl - g*delta/2);
}else{
value
}
}else
value

其曲线效果是这样的:
AE的弹性动画表达式Overshoot@BounceBack-讲故事的手艺人

AE表达式
赞赏 赞(6) 收藏(0)
CSC电影学院听课笔记|穆德远,一位电影人的必修课05:电影摄影师的修养
上一篇
AE表达式|利用Math.round,random,clamp函数表达“可能性随机”
下一篇

请登录以参与评论

现在登录
暂无评论
标签
720全景 ACES AE AE案例 AE表达式 Anyu翻译 CSC电影学院 fusion Hackintosh MG动画 ps教程 vlog wordpress 创意方法 剪辑 字幕 帧影帧画 抖音 摄影 文案 混剪 混音 灯光 看电影 磨皮 穿越机 纪录片 编剧 美术 美食 論語 调度 调色 达芬奇 重讀文學史 青玉记
室内360全景图的简单修图
2020-10-13 21:51:45
2,691 0 0
达芬奇:高频锐化
2020-03-21 22:41:26
3,879 0 3
3、ISO
2019-11-06 21:54:32
1,754 0 0
2、光圈和景深
2019-11-03 17:10:31
1,758 0 2
6
  • 6
  • 0
关于我:

想要读万卷书,行万里路,看万部电影。当过人民教师,做过策划师,入行影视做剪辑、导演。艺术是目的,技术是支撑,不断钻研,积聚梦想,同时分享干货。

推荐栏目:
视频论文 原创教程 后期制作 非虚构 照片 视频
特色专题:
专题汇总 宜看一侃 帧影帧画 美食摄影 重读文学史 青玉记
Copyright © 2016-2025 讲故事的手艺人. 鄂ICP备16005400号-1 鄂公网安备42050602000017号
  • 创作向
    • 写作
    • 拍摄
  • 策划向
    • 策划资料
    • 创意之道
    • 短视频研究
  • 技术向
    • AI
    • 前期拍摄
    • 后期制作
    • 原创教程
    • 影像实验
    • 影像设备
    • 穿越机
  • 艺术向
    • 研究学习
    • 大师镜头
    • 电影赏析
    • 视频论文
    • 经验总结
# 剪辑 # # 转场 # # 纪录片 #
向安宇
痴迷文字,醉心影像
420
文章
5
评论
325
喜欢