一、一句话总结
“线性插值”本质上就是——在 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
计算几个点:
| t | value(t) |
|---|---|
| 0.0 | 10 |
| 0.25 | 12.5 |
| 0.5 | 15 |
| 0.75 | 17.5 |
| 1.0 | 20 |
只要 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 随时间变化

224

被折叠的 条评论
为什么被折叠?



