Unity中的Lerp插值使用
- 前言
- Lerp是什么
- 如何使用Lerp
前言
平时在做项目中插值的使用避免不了,之前一直在插值中使用存在误区,在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了,只能无限接近”的一个概念。可能是之前脑子中没有插值的概念没理解对,或者当时看的up主也是没理解对,程序员难免会有“bug”,发现解决完善它就OK了。
一直坚持做一件事很难,希望大家都能坚持下去,慢慢的成长。
Lerp是什么
首先看官方的定义
public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
参数
返回值
a + (b - a) * t.
描述
两点之间的线性插值。
通过插值器t在点a和b之间进行插值。参数t被限制在[0,1]的范围内。这通常用于在两个端点之间的直线上找到一个点(例如,在这些点之间逐渐移动一个物体)。
以上是官方给出的描述,那Lerp的中的三个参数a,b,t具体是什么呢?
我的理解是a是起始点,b是目标点,t是一个0到1的进度,举一个例子如果a为(0,0,0)
,b为(10,10,10)
,那么t为0.5时,返回(5,5,5)。就这么简单。开发项目中最常见的就是处理摄像机的移动用到Lerp
void Update()
{
transform.position = Vector3.Lerp(transform.position, endPosition, Time.deltaTime);
}
上述代码的效果就是,运行一开始摄像机会快速向endPosition
位置移动,随着距离接近然后越来越慢。出现这个现象的原因,一开始transform.position与endPosition的距离最远,所以插值的距离也大,视觉上运动很快,随着距离慢慢靠近,插值的距离也越来越短,就会出现先快后慢的效果。这里使用Time.deltaTime
就出现了开头说的永远无法到达目标的问题。只会越来接近。
如何使用Lerp
要理解Lerp,最重要一点就是使用时要有一个进度的一个概念,如上述例子中如果t为0.5,则返回的坐标就为(5,5,5),这个0.5就是一个进度。
举例来说明,就是上述例子1秒内一个物体从(0,0,0)到(10,10,10)
Vector3 startPos = Vector3.zero;
Vector3 endPos = new Vector3(10,10,10);
float duration = 1f;
float curTime = 0f;
void Update()
{
float t = curTime / duration;
transform.position = Vector3.Lerp(startPos, endPos, t);
curTime+=Time.deltaTime;
}
上述代码中的t
就是进度,这样就不会到达不了endPos
。
如有错误,欢迎指正。