IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> AE特效解读 -> 正文阅读

[游戏开发]AE特效解读

// 解读:Musicminion 
// 注释:原始的代码里面有一些冗余代码,我做了一些删除

// 首先要理解这个表达式表达的是什么:这个表达式表示的是动画完成的
// 以位置参数为例子:
// 真实的位置参数 = 该图层在变换中的位置 + 偏移量(动画制作/表达式选择器中的位置值) * 表达式选择器里面的数量百分比


// 这个数量百分比可以从 0% -> 100%, 也可以从 100% -> 0% 
// 而我们这个表达式就是为了表示上面所述的 【表达式选择器里面的数量百分比】


// 首先获取该合成的设置参数
freq = effect("frequency")("滑块");		//(频率)
decay = effect("decay")("滑块");			//(衰退,减缓)
duration = effect("duration")("滑块");	//(持续时间)

// 计算延迟,也就是每两个字之间延迟多久开始动画
// 注意:表达式里面的依据是字符,也就说每个字符都是一个独立个体来计算轨迹
// thisComp.frameDuration 代表合成中1帧的持续时间
// inPoint的返回类型是数值,返回图层的入点(以秒为单位)。
retard = textIndex * thisComp.frameDuration * 2;

// t 代表每个字已经开始了多少时间,如果小于0,没开始,大于0就是已经开始
// 值得注意的是,每个文字的开始时间是不同的!
t = time - (inPoint + retard);
startVal = [100,100,100];
endVal = [0,0,0];

// 判断当前时间线,如果在动画的时间,那么返回一个三维数组(三维数组的值全都是X) X 范围是 0-100,对应最终的百分比
if (t < duration)
{
	// 如果 t < 0 表达式返回 [100,100,100] 如果 t > duration 表达式返回 [0,0,0]
	// 如果 t = duration / 2 ; 表达式返回 [50,50,50],
	// 如果 t = duration / 4 ; 表达式返回 [75,75,75],
	// 总之就是 小学学过的 y = kx + b 的线性函数
	linear(t,0,duration,startVal,endVal);
}
// 如果超出了动画时间,那么就要做一个震动,作为动画的结束,避免突兀
else
{
	// amp 代表振幅
	amp = (endVal - startVal)/duration;
	
	// 这句话就是小学物理,窝米噶 = 2派 除以 T; T = 1/f f 就是频率
	w = freq*Math.PI*2;
  
  // 返回一个修正后的震动值,这个值我们后续再说:
	endVal + amp*(Math.sin((t-duration)*w)/Math.exp(decay*(t-duration))/w);
}

linear 函数相当于线性映射的工具,把一个从 [ m i n , m a x ] [min,max] [min,max]区间的数字映射到 [ s t a r t V a l , e n d V a l ] [startVal,endVal] [startVal,endVal]
l i n e a r ( t , m i n , m a x , s t a r t V a l , e n d V a l ) = { s t a r t V a l , t ≤ 0 e n d V a l ? s t a r t V a l m a x ? m i n × ( t ? m i n ) + s t a r t V a l , m i n < t < m a x e n d V a l , t ≥ m a x linear(t,min,max,startVal,endVal)= \left\{ \begin{array}{} startVal, & t\leq 0\\ \frac{endVal-startVal}{max-min} \times (t-min) + startVal, & min < t < max\\ endVal, & t\geq max\\ \end{array} \right. linear(t,min,max,startVal,endVal)=? ? ??startVal,max?minendVal?startVal?×(t?min)+startVal,endVal,?t0min<t<maxtmax?
如果说,表达式选择器的数量 这个值我们用 H ( t ) H(t) H(t) 表示,那么就是:
w = 2 π T = 2 π f w=\frac{2\pi}{T}=2\pi f w=T2π?=2πf

如果你不理解表达式选择器的数量含义,请看这里:

  • 这个数量是一个0-1之间的值
  • 这个值用来修正运动
  • 以位置参数为例子:真实的位置参数 = 该图层在变换中的位置 + 偏移量(动画制作/表达式选择器中的位置值) * 表达式选择器里面的数量百分比值
  • 也就是说: x = x 0 + k Δ x ( 0 ≤ k ≤ 100 % ) x = x_0 + k\Delta x (0\leq k \leq 100\%) x=x0?+kΔx(0k100%)
  • 在运动中,k可以从0变到1,也可以从1变到0,取决于运动设计者。

H ( t ) = { 0 , t ≤ t 0 100 ? 100 d u r a t i o n × ( t ? t 0 ) , t 0 < t < d u r a t i o n ? 100 d u r a t i o n × s i n [ w ( t ? d u r a t i o n ) ] w × e d e c a y × ( t ? d u r a t i o n ) , t ≥ d u r a t i o n H(t)= \left\{ \begin{array}{} 0, & t\leq t_0\\ 100 - \frac{100}{duration} \times (t-t_0) , & t_0 < t < duration\\ - \frac{100}{duration} \times \frac{sin[w(t-duration)]}{w \times e^{decay \times (t- duration)}}, & t\geq duration\\ \end{array} \right. H(t)=? ? ??0,100?duration100?×(t?t0?),?duration100?×w×edecay×(t?duration)sin[w(t?duration)]?,?tt0?t0?<t<durationtduration?

翻译成人话就是:

  • 动画还没开始前,这个表达式的值为100%
  • 动画开始,这个表达式的值线性的从 100 % 100\% 100%变化到 0 % 0\% 0%
  • 动画结束,这个表达式的值为【振幅指数级别减小】的正弦函数。

这个函数巧妙的地方在于,它完美的让二阶导在临界值的时候保证了连续,我们不妨求导一下:

H ′ ( t ) = { 0 , t ≤ t 0 ? 100 d u r a t i o n , t 0 < t < d u r a t i o n ? 100 d u r a t i o n × w × w ? c o s [ w ( t ? d u r a t i o n ) ] ? s i n [ w ( t ? d u r a t i o n ) ] d e c a y e d e c a y × ( t ? d u r a t i o n ) , t ≥ d u r a t i o n H^{'}(t)= \left\{ \begin{array}{} 0, & t\leq t_0\\ - \frac{100}{duration} , & t_0 < t < duration\\ - \frac{100}{duration \times w} \times \frac{w \cdot cos[w(t-duration)]-sin[w(t-duration)] decay}{e^{decay \times (t- duration)}}, & t\geq duration\\ \end{array} \right. H(t)=? ? ??0,?duration100?,?duration×w100?×edecay×(t?duration)w?cos[w(t?duration)]?sin[w(t?duration)]decay?,?tt0?t0?<t<durationtduration?

t = d u r a t i o n t=duration t=duration 的时候,你会发现第二行的表达式结果完全等于第三行的结果,也就是保证了运动的速度的连续性变化!

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:12:26  更:2022-10-08 21:13:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 5:46:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码