1.Lerp
介绍:
lerp的三个参数分别为 a, b, t
在 a 与 b 之间返回以 t 为百分比的插值。
如
float result = Mathf.Lerp(0, 10, 0.1f)
则 result 的值为 (10 - 0)* 0.1 = 1
如果将 result 的值作为 a 传进去,如:
private float result;
private void Update()
{
Debug.Log(result);
result = Mathf.Lerp(result, 10, 0.5f);
}
其输出的值为 5, 7.5, 8.75, 9.375......10
可见其原理有点类似于二分,即:

API:

应用:
需要直线移动、简单过渡时,如 UI 动画、颜色渐变等。
2.Slerp
介绍:
其性质与 Lerp 类似,不过它是球面线性插值,可直接理解为它专门服务于四元素、欧拉角的操作,即与旋转相关。
private Vector3 result;
public Transform target;
private void Update()
{
result = Vector3.Slerp(result, target.eulerAngles, 0.1f);
}
API:

应用:
需要在两个方向之间进行平滑旋转时,如人物旋转等
3.SmoothDamp
SmoothDamp使用了一种称为“阻尼”(damping)的技术,通过逐步调整当前向量,使其平滑地接近目标向量。像Lerp会一直根据 t 这个不变的值作为“速度”,而SmoothDamp的“速度”是会变化的,类似于加上了刹车效果。
参数:
| current | 当前位置。 |
| target | 尝试达到的目标。 |
| currentVelocity | 当前速度,此值由函数在每次调用时进行修改。 |
| smoothTime | 达到目标所需的近似时间。值越小,达到目标的速度越快。 |
| maxSpeed | 可以选择允许限制最大速度。 |
| deltaTime | 自上次调用此函数以来的时间。默认情况下为 Time.deltaTime。 |
因为其原理过于复杂,咋们只要会用就行。
private Vector3 result;
public Transform target;
//表示当前速度
private Vector3 velocity;
private void Update()
{
result = Vector3.SmoothDamp(result, target.position, ref velocity, 0.1f);
}
API:

应用:
需要平滑移动时,如相机跟随,动画过渡,物理模拟等
4.LerpUnclamped与SlerpUnclamped
非牵制性的线性差值。
可直接这样理解,Lerp和Slerp的 0 <= t <= 1 ,且其返回值不会大于b,而 t 可随便取值, 其返回值可大于 b。


2408

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



