轻松明白线性插值

一、一句话总结

“线性插值”本质上就是——在 A 和 B 之间,按一个比例 t,算出“中间某个点”的值。

二、直观感受

A = 10, B = 20 比例 0 < t < 1。

t = 0,结果就是 A(10)

t = 1,结果就是 B(20)

t = 0.5,结果就是 A 和 B 的正中间(15)

t = 0.3,结果就是从 A 到 B 的 30% 位置(13)

数学公式就是:

Lerp(a, b, t) = a + (b - a) * t       (0 <= t <= 1)

三、结果值对t是线性的,t对时间可以是非线性

3.1 结果值对t是线性的

结果值对t是线性的的意思是:
把插值结果当成参数t的函数时,这个函数的图形是一条直线,而不是曲线。比如:


float Lerp(float a, float b, float t)
{
    return a + (b - a) * t;
}
 

从10插值到20

value(t) = 10 + (20 - 10) * t
         = 10 + 10 * t

计算几个点:

tvalue(t)
0.010
0.2512.5
0.515
0.7517.5
1.020

只要 t 每次加同样的量(这里是 +0.25),value 每次也加同样的量(这里是 +2.5)。
这就是:

value 对 t 的变化是“匀速”的 → 图像是一条直线 → 叫“线性关系”。

在坐标系中:

value
  ^
20|                      *
  |
15|              *
  |
10|      *
  +--------------------------> t
   0    0.5                 1

 

3.2 t对时间可以是非线性

t 可以是任意函数:t = f(time),你可以弄成:

  • 线性:t = time / duration

  • 平方:t = (time / duration)²

  • 缓入缓出:t = EaseInOut(time / duration)

  • 曲线:t = curve.Evaluate(time / duration)

所以t 不一定匀速这件事,和“value 对 t 是否线性”是两回事**:

  • 线性插值:保证公式对 t 是直线关系

  • 实际动画节奏:取决于你如何让 t 随时间变化

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值